package com.goafanti.order.service.impl; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.record.EOFRecord; import org.apache.poi.xssf.usermodel.XSSFWorkbook; 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 com.goafanti.common.bo.Error; import com.goafanti.common.constant.AFTConstants; import com.goafanti.common.dao.AdminMapper; import com.goafanti.common.dao.OrganizationContactBookMapper; import com.goafanti.common.dao.OrganizationIdentityMapper; import com.goafanti.common.dao.TOrderBonusMapper; import com.goafanti.common.dao.TOrderLogMapper; import com.goafanti.common.dao.TOrderNewMapper; import com.goafanti.common.dao.TOrderTaskMapper; import com.goafanti.common.dao.TTaskHoursMapper; import com.goafanti.common.dao.TTaskLogMapper; import com.goafanti.common.dao.TaskHoursCountMapper; import com.goafanti.common.dao.TaskLogMapper; import com.goafanti.common.dao.TaskProgressMapper; import com.goafanti.common.enums.NoticeStatus; import com.goafanti.common.enums.OrderLogProcess; import com.goafanti.common.error.BusinessException; import com.goafanti.common.model.Admin; import com.goafanti.common.model.OrganizationContactBook; import com.goafanti.common.model.OrganizationIdentity; import com.goafanti.common.model.TOrderBonus; import com.goafanti.common.model.TOrderLog; import com.goafanti.common.model.TOrderNew; import com.goafanti.common.model.TOrderTask; import com.goafanti.common.model.TTaskHours; import com.goafanti.common.model.TTaskLog; import com.goafanti.common.model.TaskHoursCount; import com.goafanti.common.model.TaskLog; import com.goafanti.common.model.TaskProgress; import com.goafanti.common.utils.DateUtils; import com.goafanti.common.utils.ExportExcelUtil; import com.goafanti.core.mybatis.BaseMybatisDao; import com.goafanti.core.mybatis.page.Pagination; import com.goafanti.core.shiro.token.TokenManager; import com.goafanti.order.bo.TOrderTaskBo; import com.goafanti.order.bo.TOrderTaskDetailBo; import com.goafanti.order.bo.TOrderTaskListBo; import com.goafanti.order.bo.TaskLogBo; import com.goafanti.order.bo.TaskProgressBo; import com.goafanti.order.enums.BonusSubject; import com.goafanti.order.enums.ProcessStatus; import com.goafanti.order.enums.ProjectNewStage; import com.goafanti.order.service.OrderNewService; import com.goafanti.order.service.OrderProjectService; import com.goafanti.techproject.enums.TaskState; @Service public class OrderProjectServiceImpl extends BaseMybatisDao implements OrderProjectService { @Autowired private TOrderTaskMapper tOrderTaskMapper; @Autowired private TOrderNewMapper tOrderNewMapper; @Autowired private TTaskHoursMapper tTaskHoursMapper; @Autowired private TOrderBonusMapper tOrderBonusMapper; @Autowired private TTaskLogMapper tTaskLogMapper; @Autowired private TOrderLogMapper tOrderLogMapper; @Autowired private TaskProgressMapper taskProgressMapper; @Autowired private OrganizationContactBookMapper organizationContactBookMapper; @Autowired private OrganizationIdentityMapper organizationIdentityMapper; @Autowired private TaskLogMapper taskLogMapper; @Autowired private OrderNewService orderNewService; @Autowired private TaskHoursCountMapper taskHoursCountMapper; @Autowired private AdminMapper adminMapper; @Value(value = "${upload.path}") private String uploadPath = null; @Override public int updateProjectDistribution(Integer taskId, String taskReceiverId,Integer specially) { TOrderTask t=tOrderTaskMapper.selectByPrimaryKey(taskId); t.setTaskStatus(TaskState.DISTRIBUTION.getCode()); t.setTaskAllocator(TokenManager.getAdminId()); t.setTaskReceiver(taskReceiverId); t.setTaskDistributionTime(new Date()); Admin a=adminMapper.selectByPrimaryKey(taskReceiverId); if (a==null||a.getId()==null) { throw new BusinessException(new Error("分配人员不存在!","分配人员不存在!")); } insetLog(taskId, taskReceiverId); //0-经理 (经理分派会创建子项目)1 管理员或经理转交 if (specially==1) { addOrderLog(t.getOrderNo(), OrderLogProcess.XMDDPD.getCode()); t.setManagerId(taskReceiverId); t.setConsultantId(null); }else if (specially==0) { addOrderLog(t.getOrderNo(), OrderLogProcess.XMPD.getCode()); t.setConsultantId(taskReceiverId); }else if(specially==2) { //咨询师推给咨询师经理 t.setConsultantId(null); } tOrderTaskMapper.updateByPrimaryKey(t); List aids = new ArrayList<>(); aids.add(taskReceiverId); orderNewService.pushGeneralSendNoticeAndEmail(aids, NoticeStatus.ORDER_TASK_TO.getCode(),t.getOrderNo(), TokenManager.getAdminId()); updateOrder(t); return 1; } private TOrderNew checkDeleteSign(String orderNo) { TOrderNew t=tOrderNewMapper.selectByPrimaryKey(orderNo); //if(t.getDeleteSign()==2) throw new BusinessException(new Error(ErrorConstants.ORDER_ALREADY_REVOKE, t.getOrderNo(),"")); return t; } public void addOrderLog(String orderNo, Integer code) { TOrderLog tl=new TOrderLog(); tl.setOrderNo(orderNo); tl.setProcess(code); tl.setAid(TokenManager.getAdminId()); tOrderLogMapper.insertSelective(tl); } private void updateOrder(TOrderTask t) { List taskBos=tOrderTaskMapper.selectOrderTask(t.getOrderNo()); TOrderNew tNew=new TOrderNew(); tNew.setOrderNo(t.getOrderNo()); int i=0; for (TOrderTaskBo to : taskBos) { if (to.getTaskStatus()>=TaskState.DISTRIBUTION.getCode()&&to.getTaskStatus() orderTaskList(String name, String orderNo, String taskId, Integer taskStatus, String adminName,Integer specially, String depId, String contractNo,Integer projectStatus ,Integer pageNo, Integer pageSize,Integer outsource) { Map params = new HashMap(); if(pageSize==null||pageSize<0)pageSize=10; if(pageNo==null||pageNo<0)pageNo=1; params.put("aid", TokenManager.getAdminId()==null?"1":TokenManager.getAdminId()); if (null!=specially) params.put("specially", specially); if (StringUtils.isNotBlank(name)) params.put("name", name); if (StringUtils.isNotBlank(depId)) params.put("depId", depId); if (StringUtils.isNotBlank(orderNo)) params.put("orderNo", orderNo); if (StringUtils.isNotBlank(contractNo)) params.put("contractNo", contractNo); if (projectStatus !=null ) params.put("projectStatus", projectStatus); if (StringUtils.isNotBlank(taskId)) params.put("taskId", taskId); if (StringUtils.isNotBlank(adminName)) params.put("adminName", adminName); if (null != taskStatus) params.put("taskStatus", taskStatus); params.put("outsource", outsource==null?0:outsource); Pagination p = (Pagination)findPage("selectOrderTaskListByPage", "selectOrderTaskListCount", params, pageNo, pageSize); return p; } @Override public TOrderTaskDetailBo orderTaskDetail(String id) { return tOrderTaskMapper.getOrderTaskDetail(id); } @Override @Transactional public int updateOrderTask(TOrderTaskDetailBo t) { TOrderTask task=new TOrderTask(); TOrderNew tn=checkDeleteSign(t.getOrderNo()); task.setAttachmentUrl(t.getAttachmentUrl()); task.setId(Integer.valueOf(t.getId())); task.setTaskStatus(t.getTaskStatus()); task.setProjectStatus(t.getProjectStatus()); task.setTaskComment(t.getTaskComment()); task.setCertificateNumber(t.getCertificateNumber()); task.setStatus(t.getStatus()); task.setFormRetrieve(t.getFormRetrieve()); task.setTaskRefund(t.getTaskRefund()); task.setRefundContent(t.getRefundContent()); task.setRetrieveContent(t.getRetrieveContent()); task.setDeclareUser(t.getDeclareUser()); task.setDeclarePwd(t.getDeclarePwd()); task.setArrivalMoney(t.getArrivalMoney()); task.setSetUpAmount(t.getSetUpAmount()); task.setOutsourceName(t.getOutsourceName()); if(StringUtils.isNotBlank(t.getOutsourcePrice()))task.setOutsourcePrice(new BigDecimal(t.getOutsourcePrice())); //根据修改的修改订单法人与联系人 if(StringUtils.isNotEmpty(t.getContacts()))tn.setContacts(t.getContacts()); if(StringUtils.isNotEmpty(t.getContactMobile())) tn.setContactMobile(t.getContactMobile()); if(StringUtils.isNotEmpty(t.getLegalPerson()))tn.setLegalPerson(t.getLegalPerson()); if(StringUtils.isNotEmpty(t.getLegalPersonTel()))tn.setLegalPersonTel(t.getLegalPersonTel()); tOrderNewMapper.updateByPrimaryKeySelective(tn); //修改公司地址信息 if (null!=t.getLocationProvince()||null!=t.getLocationArea()||null!=t.getLocationCity()||null!=t.getPostalAddress()) { OrganizationIdentity org=new OrganizationIdentity(); org.setUid(tn.getBuyerId()); org.setLocationProvince(t.getLocationProvince()); org.setLocationArea(t.getLocationArea()); org.setLocationCity(t.getLocationCity()); org.setPostalAddress(t.getPostalAddress()); organizationIdentityMapper.updateServiceByUid(org); } //修改公司联系人 int adcount=organizationContactBookMapper.checkContacts(tn.getBuyerId(), t.getContactMobile(),tn.getSalesmanId()); if (StringUtils.isNotBlank(t.getContacts())&&StringUtils.isNotBlank(t.getContactMobile())&&adcount<1) { OrganizationContactBook contactBook=new OrganizationContactBook(); contactBook.setId(UUID.randomUUID().toString()); contactBook.setAid(tn.getSalesmanId()); contactBook.setUid(tn.getBuyerId()); contactBook.setName(t.getContacts()); contactBook.setMobile(t.getContactMobile()); organizationContactBookMapper.insertSelective(contactBook); } //新增结算奖金信息 checkSettlementAward(tn,task); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { if(StringUtils.isNotBlank(t.getStartDate()))task.setTaskStartTime(sdf.parse(t.getStartDate())); if(StringUtils.isNotBlank(t.getEndDate()))task.setTaskEndTime(sdf.parse(t.getEndDate())); if(StringUtils.isNotBlank(t.getAcceptDate()))task.setAcceptTime(sdf.parse(t.getAcceptDate())); if(StringUtils.isNotBlank(t.getReviewDate()))task.setReviewTime(sdf.parse(t.getReviewDate())); if(StringUtils.isNotBlank(t.getPublicityDate()))task.setPublicityTime(sdf.parse(t.getPublicityDate())); if(StringUtils.isNotBlank(t.getLicenceDate()))task.setLicenceTime(sdf.parse(t.getLicenceDate())); } catch (ParseException e) { e.printStackTrace(); } TOrderTask task2=tOrderTaskMapper.selectByPrimaryKey(task.getId());//查询出项目信息 tOrderTaskMapper.updateByPrimaryKeySelective(task); TaskLog tl=new TaskLog(); tl.setCreateTime(new Date()); tl.setTaskId(t.getId()); tl.setAid(TokenManager.getAdminId()); if (t.getStatus()!=null) { if (t.getStatus()!=task2.getStatus()) { String s="将当前项目状态修改为"; if (t.getStatus()==0)s+="开启"; if (t.getStatus()==1)s+="暂停"; tl.setContent(s); taskLogMapper.insertSelective(tl); } if (t.getTaskRefund()!=task2.getTaskRefund()) { String s="将当前项目退单修改为"; if (t.getTaskRefund()==0)s+="未完成"; if (t.getTaskRefund()==1)s+="已完成"; if (t.getTaskRefund()==2)s+="其他"; tl.setContent(s); taskLogMapper.insertSelective(tl); } if (t.getFormRetrieve()!=task2.getFormRetrieve()) { String s="将当前满意度表格回收修改为"; if (t.getFormRetrieve()==0)s+="未回收"; if (t.getFormRetrieve()==1)s+="已回收"; if (t.getFormRetrieve()==2)s+="其他"; tl.setContent(s); taskLogMapper.insertSelective(tl); } } if (task2.getSuperId()!=null) {//是否有父项目 TOrderTask task3 =tOrderTaskMapper.selectBySuperId(task2.getSuperId()); task3.setId(Integer.valueOf(task2.getSuperId())); task3.setSuperId(null); tOrderTaskMapper.updateByPrimaryKeySelective(task3); TOrderTask task4 = tOrderTaskMapper.selectByPrimaryKey(Integer.valueOf(task2.getSuperId())); meanwhileUpdateOrder(task4); }else { meanwhileUpdateOrder(task2); } return 1; } private void checkSettlementAward(TOrderNew tn,TOrderTask task) { if(task.getTaskStatus()==TaskState.COMPLETE.getCode()&&tn.getTotalAmount().compareTo(tn.getSettlementAmount())==0) { List l = tOrderTaskMapper.getReceiverByOid(tn.getOrderNo()); for (TOrderTask tOrderTask : l) { if(null != tOrderTask &&null != tOrderTask.getTaskReceiver()){ TOrderBonus bonus = new TOrderBonus(); bonus.setId(UUID.randomUUID().toString()); bonus.setOrderNo(tn.getOrderNo()); bonus.setGrantBy(tn.getFinanceId()); bonus.setBonusSubject(BonusSubject.WK.getCode());//12 bonus.setTaskId(tOrderTask.getId());//任务id bonus.setGrantTarget(tOrderTask.getTaskReceiver()); bonus.setGrantType(1); int c = tOrderBonusMapper.checkByOnoAndSub(bonus); //不存在就设置 if(c==0){ bonus.setId(UUID.randomUUID().toString()); tOrderBonusMapper.insertSelective(bonus); } } } } } private void meanwhileUpdateOrder(TOrderTask task) { // if (task.getMain()==1) {//是否是主要项目 更改为不管是不是主项目都会有奖金信息 //更改订单项目状态 TOrderNew tNew=new TOrderNew(); tNew.setProjectStatus(task.getProjectStatus()); tNew.setOrderNo(task.getOrderNo()); tOrderNewMapper.updateByPrimaryKeySelective(tNew); if (task.getProjectStatus()==ProjectNewStage.YTJ.getCode()||task.getProjectStatus()==ProjectNewStage.LS.getCode()|| task.getProjectStatus()==ProjectNewStage.GS.getCode()) { TOrderBonus tb=new TOrderBonus(); TOrderNew t=tOrderNewMapper.selectByPrimaryKey(task.getOrderNo()); tb.setId(UUID.randomUUID().toString()); tb.setOrderNo(task.getOrderNo()); if (task.getProjectStatus()==ProjectNewStage.YTJ.getCode()) { tb.setBonusSubject(21);//项目已提交 addOrderLog(task.getOrderNo(),OrderLogProcess.XMWC.getCode()); } if (task.getProjectStatus()==ProjectNewStage.LS.getCode())tb.setBonusSubject(23);//项目立项 if (task.getProjectStatus()==ProjectNewStage.GS.getCode())tb.setBonusSubject(24);//项目公示 tb.setGrantType(1);//技术员 //新增奖金之前检查这个奖金数据是否存在 tb.setGrantTarget(task.getTaskReceiver()); int c = tOrderBonusMapper.checkByOnoAndSub(tb); if(c==0){ tb.setGrantBy(t.getFinanceId()); tb.setTaskId(task.getId()); tOrderBonusMapper.insertSelective(tb); } } } @Override public int addTaskHours(TTaskHours t) { t.setAid(TokenManager.getAdminId()==null?"1":TokenManager.getAdminId()); t.setId(UUID.randomUUID().toString()); t.setCreateTime(new Date()); if(taskHoursCountMapper.selectByAidAndTid(TokenManager.getAdminId(),t.getTaskId())>0) { taskHoursCountMapper.updateByAidAndTid(TokenManager.getAdminId(),t.getTaskId(),t.getHours()); }else { TaskHoursCount tc=new TaskHoursCount(); tc.setAid(TokenManager.getAdminId()); tc.setTid(Integer.valueOf(t.getTaskId())); tc.setHours(t.getHours()); taskHoursCountMapper.insertSelective(tc); } return tTaskHoursMapper.insertSelective(t); } @SuppressWarnings("unchecked") @Override public Pagination taskHoursList(String name, String taskId, String starTime,String endTime ,Integer type, Integer pageNo, Integer pageSize) { Map params = new HashMap(); if(pageSize==null||pageSize<0)pageSize=10; if(pageNo==null||pageNo<0)pageNo=1; if (StringUtils.isNotBlank(name)) params.put("name", name); if (StringUtils.isNotBlank(taskId)) params.put("taskId", taskId); if (StringUtils.isNotBlank(starTime)) params.put("starTime", starTime); if (StringUtils.isNotBlank(endTime)) params.put("endTime", endTime+" 23:59:59"); if(type!=null&&type==1)params.put("fid", TokenManager.getAdminId()); Pagination p = (Pagination)findPage("selectTaskHoursListByPage", "selectTaskHoursListCount", params, pageNo, pageSize); return p; } @Override public XSSFWorkbook exportTaskHoursListData(String name, String taskId, String startTime, String endTime,Integer type) { if(StringUtils.isNoneBlank(endTime)) endTime=endTime+" 23:59:59"; String fid=null; if(type!=null&&type==1)fid=TokenManager.getAdminId(); List list=tTaskHoursMapper.getTaskHoursData(name,taskId,startTime,endTime,fid); if (list==null || list.size()==0) return null; String[] comment = {"任务编号","任务名称","订单编号","业务别类","订单部门","客户名称","任务负责人","任务状态","工时","合同编号","签单日期","派单日期"}; String filePath = uploadPath + "/TaskHours"; XSSFWorkbook wb = ExportExcelUtil.exportTaskHoursListData(list, comment, filePath); return wb; } @SuppressWarnings("unchecked") @Override public Pagination selectTaskList(String name, String orderNo, String taskId, Integer taskStatus, String adminName, Integer specially,String depId , Integer pageNo, Integer pageSize) { Map params = new HashMap(); if(pageSize==null||pageSize<0)pageSize=10; if(pageNo==null||pageNo<0)pageNo=1; params.put("aid", TokenManager.getAdminId()==null?"":TokenManager.getAdminId()); if (StringUtils.isNotBlank(name)) params.put("name", name); if (StringUtils.isNotBlank(depId)) params.put("depId", depId); if (StringUtils.isNotBlank(orderNo)) params.put("orderNo", orderNo); if (StringUtils.isNotBlank(taskId)) params.put("taskId", taskId); if (StringUtils.isNotBlank(adminName)) params.put("adminName", adminName); if (null != taskStatus) params.put("taskStatus", taskStatus); Pagination p = (Pagination)findPage("selectTaskListByPage", "selectTaskListCount", params, pageNo, pageSize); return p; } @Override public List TaskLogList(Integer id) { return taskLogMapper.selectTaskLogList(id); } @Override public int createTaskProgress(TaskProgressBo t) { TaskProgress tp=new TaskProgress(); TOrderTask tt=tOrderTaskMapper.selectByPrimaryKey(t.getTaskId()); int count =taskProgressMapper.AlreadyNuberCount(t.getTaskId()); count +=t.getAlreadyNumber(); if(tt.getCommodityQuantity() selectTaskProgress(Integer tid) { List l=taskProgressMapper.selectTaskProgress(tid); int notcount=0; for (TaskProgressBo t : l) { notcount+=t.getAlreadyNumber(); t.setNotCount(t.getIngCount()-notcount); } return l; } @Override public XSSFWorkbook exportMyTaskList() { List list=taskProgressMapper.selectMyTaskList(TokenManager.getAdminId()); if (list==null || list.size()==0) return null; String[] comment = {"任务编号","任务名称","订单编号","业务别类","客户名称(软著数/下证数)","任务状态","项目状态","分配时间","订单部门"}; String filePath = uploadPath + "/MyTaskList"; XSSFWorkbook wb = ExportExcelUtil.exportSelectMyTaskList(list, comment, filePath); return wb; } @Override public List taskHoursDetailsList(String taskId) { String aid=TokenManager.getAdminId(); return tTaskHoursMapper.taskHoursDetailsList(taskId,aid); } }