package com.goafanti.organization.service.impl;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
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 javax.mail.MessagingException;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.goafanti.admin.bo.AdminListBo;
import com.goafanti.common.bo.EmailBo;
import com.goafanti.common.bo.Error;
import com.goafanti.common.constant.AFTConstants;
import com.goafanti.common.dao.AdminMapper;
import com.goafanti.common.dao.CompanyLibraryMapper;
import com.goafanti.common.dao.FinancialPaymentMapper;
import com.goafanti.common.dao.NoticeMapper;
import com.goafanti.common.dao.OfficialFeePriceMapper;
import com.goafanti.common.dao.PatentPriceMapper;
import com.goafanti.common.dao.PaymentLogMapper;
import com.goafanti.common.dao.PaymentNodeMapper;
import com.goafanti.common.dao.SoftWritingPriceMapper;
import com.goafanti.common.dao.TOrderOutsourceMapper;
import com.goafanti.common.dao.TOrderPaymentMapper;
import com.goafanti.common.dao.TOrderTaskMapper;
import com.goafanti.common.dao.ThirdPartyCompanyMapper;
import com.goafanti.common.enums.NoticeStatus;
import com.goafanti.common.error.BusinessException;
import com.goafanti.common.model.CompanyLibrary;
import com.goafanti.common.model.Notice;
import com.goafanti.common.model.OfficialFeePrice;
import com.goafanti.common.model.PatentPrice;
import com.goafanti.common.model.PaymentLog;
import com.goafanti.common.model.PaymentNode;
import com.goafanti.common.model.SoftWritingPrice;
import com.goafanti.common.model.TOrderPayment;
import com.goafanti.common.model.TOrderTask;
import com.goafanti.common.model.ThirdPartyCompany;
import com.goafanti.common.utils.DateUtils;
import com.goafanti.common.utils.ExportExcelUtil;
import com.goafanti.common.utils.SendEmailUtil;
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.OrderOutsourceDtails;
import com.goafanti.order.bo.TOrderTaskDetailBo;
import com.goafanti.order.enums.NewOrderDunType;
import com.goafanti.order.enums.ProjectNewStage;
import com.goafanti.organization.bo.InputNodeList;
import com.goafanti.organization.bo.InputPaymentList;
import com.goafanti.organization.bo.InputPaymentNode;
import com.goafanti.organization.bo.InuptFinancialPayment;
import com.goafanti.organization.bo.NoticeInformationBo;
import com.goafanti.organization.bo.OutPaymentLog;
import com.goafanti.organization.bo.OutPaymentNode;
import com.goafanti.organization.bo.OutThirdPartyCompany;
import com.goafanti.organization.bo.outFinancialPayment;
import com.goafanti.organization.bo.outNodeList;
import com.goafanti.organization.bo.outPaymentList;
import com.goafanti.organization.bo.outProjectBo;
import com.goafanti.organization.bo.outOrderPayment;
import com.goafanti.organization.service.ThirdPartyCompanyService;

@Service
public class ThirdPartyCompanyServiceImpl extends  BaseMybatisDao<ThirdPartyCompanyMapper> implements ThirdPartyCompanyService {

	@Autowired
	private ThirdPartyCompanyMapper	thirdPartyCompanyMapper;
	@Autowired
	private CompanyLibraryMapper	companyLibraryMapper;
	@Autowired
	private PaymentNodeMapper	paymentNodeMapper;
	@Autowired
	private TOrderPaymentMapper	tOrderPaymentMapper;
	@Autowired
	private PaymentLogMapper	paymentLogMapper;
	@Autowired
	private AdminMapper	adminMapper;
	@Autowired
	private NoticeMapper	noticeMapper;
	@Autowired
	private FinancialPaymentMapper	financialPaymentMapper;
	@Autowired
	private TOrderTaskMapper	tOrderTaskMapper;
	@Autowired
	private SoftWritingPriceMapper	softWritingPriceMapper;
	@Autowired
	private OfficialFeePriceMapper	officialFeePriceMapper;
	@Autowired
	private PatentPriceMapper	patentPriceMapper;
	@Autowired
	private TOrderOutsourceMapper	tOrderOutsourceMapper;
	
	


	@Override
	public int addCompany(ThirdPartyCompany t,Integer calculation) {
			CompanyLibrary c=new CompanyLibrary();
			String aid=TokenManager.getAdminId();
			if(calculation==0) {
				List<Integer> list=companyLibraryMapper.selectName(t.getCompanyName(),1,aid);
				if (list.size()<1) {
					c.setCompanyName(t.getCompanyName());
					c.setAid(aid);
					c.setType(1);//类型 0软著 1其他 2专利
					companyLibraryMapper.insertSelectiveGetId(c);
					t.setCid(c.getId());
				}else {
					t.setCid(list.get(0));
				}
				t.setTotalAmount(t.getUnitPrice().multiply(new BigDecimal(t.getQuantity())));
			}
		thirdPartyCompanyMapper.insertSelective(t);
		return 1;
	}


	


	@Override
	public int updateCompany(ThirdPartyCompany t,Integer calculation) {
		if (calculation==0) {//0其他 1计算
			CompanyLibrary c=new CompanyLibrary();
			String aid=TokenManager.getAdminId();
			List<Integer> list=companyLibraryMapper.selectName(t.getCompanyName(),1,aid);
			if (list.size()<1) {
				c.setCompanyName(t.getCompanyName());
				c.setAid(aid);
				c.setType(1);//0系统 1录入
				companyLibraryMapper.insertSelectiveGetId(c);
				t.setCid(c.getId());
			}else {
				t.setCid(list.get(0));
			}
			t.setTotalAmount(t.getUnitPrice().multiply(new BigDecimal(t.getQuantity())));
		}
		thirdPartyCompanyMapper.updateByPrimaryKeySelective(t);
		return 1; 
	}


	@Override
	public List<CompanyLibrary> selectVague(String name,Integer type) {
		String aid = null;
		if(type==null)type=1;
		if (type==1) aid=TokenManager.getAdminId();
		return companyLibraryMapper.selectVague(name,type,aid);
	}


	@Override
	public int addPaymentNode(InputPaymentNode p) {
		if (StringUtils.isNoneBlank(p.getPartyTimes())) {
			p.setPartyTime(DateUtils.StringToDate(p.getPartyTimes(), AFTConstants.YYYYMMDD));
		}
		return paymentNodeMapper.insertSelective(p);
	}

	@Override
	public boolean addNodeCheck(InputPaymentNode p) {
		ThirdPartyCompany t=thirdPartyCompanyMapper.selectByPrimaryKey(p.getCid());
		List<OutPaymentNode> list=paymentNodeMapper.selectByTidAndCid(p.getTid(),p.getCid());
		BigDecimal sum=p.getTotalAmount()==null?new BigDecimal(0):p.getTotalAmount();
		for (OutPaymentNode pn : list) {
			if (p.getId()==null || !pn.getId().equals(p.getId())) {
				sum=sum.add(pn.getTotalAmount());
			}
		}
		if(p.getUnitPrice()==null)p.setUnitPrice(t.getUnitPrice());
		if(p.getTotalAmount()==null)p.setTotalAmount(p.getUnitPrice().multiply(new BigDecimal(p.getQuantity())));
		if(p.getTotalAmount()==null)p.setTotalAmount(new BigDecimal(0));
		if (p.getTotalAmount().compareTo(t.getTotalAmount())>0) {
			return true;
		}
		if (sum.compareTo(t.getTotalAmount())>0) {
			return true;
		}
		return false;
	}

	@Override
	public int updatePaymentNode(InputPaymentNode p) {
		if (StringUtils.isNoneBlank(p.getPartyTimes())) {
			p.setPartyTime(DateUtils.StringToDate(p.getPartyTimes(), AFTConstants.YYYYMMDD));
		}
		if (p.getDunType()!=0) {
			PaymentNode pn=paymentNodeMapper.selectByPrimaryKey(p.getId());
			 pn.setPartyTime(null);
			 paymentNodeMapper.updateByPrimaryKey(pn);
		}
		return paymentNodeMapper.updateByPrimaryKeySelective(p);
	}


	@Override
	public List<OutThirdPartyCompany> selectCompany(Integer tid) {
 		List<OutThirdPartyCompany> list=thirdPartyCompanyMapper.selectByTid(tid);
		if (!TokenManager.hasRole(AFTConstants.FINANCE)&&
				!TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)&&
				!TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)&&
				!TokenManager.hasRole(AFTConstants.OUTSOURCE_AUDITOR)) {
			outProjectBo op =null;
			if(!list.isEmpty()) op=tOrderOutsourceMapper.selectByTid(tid);
			//外包type
				for (OutThirdPartyCompany oc : list) {
					// start_type	0外包 1供应商	
					if (oc.getStartType()==1) {
						if(op.getProjectType()==null)op.setProjectType(0);
						//patent_type 专利类型 0申请/变更/转让 1买卖
						//project_tyoe 0 正常 1专利 2软著 3审计
						if((op.getProjectType()==1&&oc.getPatentType()==0)
								|| op.getProjectType()==2 ) {
							oc.setUnitPrice("***");
							oc.setTotalAmount("***");
						}
					}
				}
		}
		return list;
	}

	@Override
	public List<OutPaymentNode> selectPaymentNode(Integer tid) {
		 List<OutPaymentNode> list=paymentNodeMapper.selectByTid(tid,null);
		return list;
	}


	@Override
	public int deleteCompany(String id) {
		if (id.contains(",")) {
			String []ids =id.split(",");
			for (String s : ids) {
				thirdPartyCompanyMapper.deleteByPrimaryKey(Integer.valueOf(s));
			}
		}else {
			thirdPartyCompanyMapper.deleteByPrimaryKey(Integer.valueOf(id));
		}
		return 1;
	}


	@Override
	public int deletePaymentNode(String id) {
		if (id.contains(",")) {
			String []ids =id.split(",");
			for (String s : ids) {
				paymentNodeMapper.deleteByPrimaryKey(Integer.valueOf(s));
			}
		}else paymentNodeMapper.deleteByPrimaryKey(Integer.valueOf(id));
		return 1;
	}


	@Override
	public int addOrderPayment(TOrderPayment p) {
		p.setStatus(0);
		AdminListBo a =adminMapper.getDeptNameByAid(TokenManager.getAdminId());
		p.setAid(a.getId());
		p.setAname(a.getName());
		tOrderPaymentMapper.insertSelectiveGetId(p);
		NoticeInformationBo ni=financialPaymentMapper.selectBypidGetNotice(p.getId());
		addNoticAndSendEmail(ni,a,NoticeStatus.PAYMENT_NODE.getCode());
		PaymentLog pl=new PaymentLog(p.getId(),0,"发起付款:"+p.getRemarks(),a.getId(),a.getName());
		paymentLogMapper.insertSelective(pl);
		return 1;
	}


	@Override
	public outOrderPayment OrderPaymentDetails(Integer id) {
		TOrderPayment tp=tOrderPaymentMapper.selectByPrimaryKey(id);
		Integer type=tp.getChooseType();
		outOrderPayment op=tOrderPaymentMapper.selectByidGetDetails(id);
		op.setChooseType(type);
		ThirdPartyCompany tpc=thirdPartyCompanyMapper.selectByPrimaryKey(tp.getTpcId());
		if(!op.getCompanyName().equals(tpc.getCompanyName()))op.setCompanyName(op.getCompanyName()+"("+tpc.getCompanyName()+")");
		if (type==0) {//支付种类 0第三方 1催款 2官费
			op.setInitialQuantity(tpc.getQuantity());
			op.setInitialTotalAmount(tpc.getTotalAmount().toString());
			op.setInitialUnitPrice(tpc.getUnitPrice().toString());
			op.setInitialPaymentAmount(tpc.getPartyAmount().toString());
			 
		}else if (type==1) {
			PaymentNode pn=paymentNodeMapper.selectByPrimaryKey(tp.getNodeId());
			op.setInitialQuantity(pn.getQuantity());
			op.setInitialTotalAmount(pn.getTotalAmount().toString());
			op.setInitialUnitPrice(pn.getUnitPrice().toString());
			op.setInitialPaymentAmount(pn.getPartyAmount().toString());
		}else if (type==2) {
			op.setInitialQuantity(tpc.getQuantity());
			TOrderTask tk=tOrderTaskMapper.selectByPrimaryKey(tp.getTid());
			OrderOutsourceDtails out=tOrderOutsourceMapper.selectByOrderNo(null, tp.getTid().toString());
			OfficialFeePrice of=officialFeePriceMapper.selectBytype(out.getPatentNameType());
			 if (tk.getCostReduction()==0) {
				op.setInitialUnitPrice(of.getAmount().toString());
			}else {
				op.setInitialUnitPrice(of.getProportion85().toString());
			}
			 op.setInitialTotalAmount(new BigDecimal( op.getInitialUnitPrice()).multiply(new BigDecimal(op.getInitialQuantity())).toString());
		}
	if (!TokenManager.hasRole(AFTConstants.FINANCE)&&
			!TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)&&
			!TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)&&
			!TokenManager.hasRole(AFTConstants.OUTSOURCE_AUDITOR)) {
		outProjectBo ob=tOrderOutsourceMapper.selectByTid(tp.getTid());
		if (ob!=null &&ob.getStartType()!=null&& ob.getStartType()==1) {
			if((ob.getProjectType()==1&&ob.getPatentType()==0)
					||(ob.getProjectType()==2)) {
				op.setInitialUnitPrice("***");
				op.setInitialTotalAmount("***");
			}
		}
		
	}
		return op;
	}


	@Override
	public int updateOrderPayment(TOrderPayment p) {
		TOrderPayment tp=new TOrderPayment();
		tp.setId(p.getId());
		tp.setRemarks(p.getRemarks());
		tp.setStatus(p.getStatus());
		Integer type=NoticeStatus.PAYMENT_NODE.getCode();
		String auditStr="重新发起付款:";
		//状态 0审核 1待支付 2驳回 3已支付 4取消
		if (p.getStatus()==0) {
			tp.setApplicationAmount(p.getApplicationAmount());
			tp.setChooseType(p.getChooseType());
			tp.setPaymentType(p.getPaymentType());
			tp.setPaymentAmount(p.getPaymentAmount());
			tp.setQuantity(p.getQuantity());
			tp.setPaymentStatus(p.getPaymentStatus());
		}else if (p.getStatus()==1) {
			type= NoticeStatus.PAYMENT_YES.getCode();
			tp.setApplicationAmount(p.getApplicationAmount());
			tp.setQuantity(p.getQuantity());
			auditStr="审核通过:";
		}else if(p.getStatus()==2) {
			type= NoticeStatus.PAYMENT_NO.getCode();
			tp.setApplicationAmount(p.getApplicationAmount());
			auditStr="审核驳回:";
		}else if (p.getStatus()==3) {
			type=NoticeStatus.PAYMENT_COMPLETE.getCode();
			tp.setPaymentAmount(p.getPaymentAmount()==null?p.getPaymentAmount():p.getApplicationAmount());
			confirmPayment(p);
			auditStr="审核完成";
		}else if(p.getStatus()==4) {
			auditStr="付款取消";
		}
		NoticeInformationBo ni=financialPaymentMapper.selectBypidGetNotice(p.getId());
		AdminListBo a =adminMapper.getDeptNameByAid(TokenManager.getAdminId());
		addNoticAndSendEmail(ni,a,type);
		PaymentLog pl=new PaymentLog(p.getId(),p.getStatus(),auditStr+p.getAuditNotes()==null?"":p.getAuditNotes(),a.getId(),a.getName());
		paymentLogMapper.insertSelective(pl);
		return tOrderPaymentMapper.updateByPrimaryKeySelective(tp);
	}


	private void confirmPayment(TOrderPayment p) {
		//如果确定支付
			int flag=0;
			TOrderPayment tp=tOrderPaymentMapper.selectByPrimaryKey(p.getId());
			ThirdPartyCompany tpc=new ThirdPartyCompany();
			if (p.getPaymentAmount()==null||p.getPaymentAmount().compareTo(new BigDecimal(0))==0) {
				p.setPaymentAmount(tp.getApplicationAmount());
			}
			if(tp.getChooseType()==0){
				tpc=thirdPartyCompanyMapper.selectByPrimaryKey(tp.getTpcId());
			}else if (tp.getChooseType()==1) {
				PaymentNode pn=paymentNodeMapper.selectByPrimaryKey(tp.getNodeId());
				BigDecimal count=pn.getTotalAmount();
				BigDecimal party=pn.getPartyAmount();
				party=party.add(p.getPaymentAmount());
				if (party.compareTo(new BigDecimal(0))==0) {
					flag=0;
				}else if (party.compareTo(count)==0) {
					flag=2;
				}else if (party.compareTo(count)==-1) {
					flag=1;
				}
				pn.setStatus(flag);
				pn.setPartyAmount(p.getPaymentAmount());
				paymentNodeMapper.updateByPrimaryKeySelective(pn);
				tpc=thirdPartyCompanyMapper.selectByPrimaryKey(pn.getCid());
			}else if(tp.getChooseType()==2){
				tpc=thirdPartyCompanyMapper.selectByPrimaryKey(tp.getTpcId());
				tpc.setOfficialAmount(tpc.getOfficialAmount().add(p.getPaymentAmount()));
			}
			tpc.setPartyAmount(tpc.getPartyAmount().add(p.getPaymentAmount()));
			p.setPaymentAmount(p.getApplicationAmount());
			financialPaymentMapper.updateOrderCost(p.getId(),p.getPaymentAmount());
			thirdPartyCompanyMapper.updateByPrimaryKeySelective(tpc);
	}


	@Override
	public List<OutPaymentLog> selectPaymentLog(Integer id) {
		return paymentLogMapper.selectByPid(id);
	}


	@Override
	public List<outOrderPayment> selectOrderPayment(Integer id) {
		List<outOrderPayment> list=tOrderPaymentMapper.selectByTid(id);
		if (!TokenManager.hasRole(AFTConstants.FINANCE)&&
				!TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)&&
				!TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)&&
				!TokenManager.hasRole(AFTConstants.OUTSOURCE_AUDITOR)) {
			outProjectBo op =null;
			if(!list.isEmpty()) op=tOrderOutsourceMapper.selectByTid(id);
			if (op!=null &&op.getStartType()!=null&&op.getStartType()==1) {
				if((op.getProjectType()==1&&op.getPatentType()==0)||(op.getProjectType()==2)) {
					for (outOrderPayment oc : list) {
						if (oc.getChooseType()!=2) {
							oc.setApplicationAmount("***");
						}
					}
				}
			}
		}
		return list;
	}


	@Override
	public int addfinancialPayment(InuptFinancialPayment f) {
		f.setPaymentTime(DateUtils.StringToDate(f.getPaymentTimes(), AFTConstants.YYYYMMDD));
		financialPaymentMapper.insertSelectiveGetId(f);
		return f.getId(); 
	}


	@Override
	public List<outFinancialPayment> selectfinancialPayment(Integer id) {
		return financialPaymentMapper.selectByPid(id);
	}


	public void addNoticAndSendEmail(NoticeInformationBo in,AdminListBo a,Integer type) {
		String str=NoticeStatus.getValueByCode(type)+": 订单编号 -"+in.getOrderNo()+
				"，客户名称："+in.getBuyerName()+"， 操作人:"+a.getName()+"-"+a.getDepartmentName()+"。";
		Notice n =new Notice();
		EmailBo bo = new EmailBo(NoticeStatus.getValueByCode(type), a.getEmail(), a.getDepartmentName(), a.getName(),
				in.getOrderNo(), in.getSalesmanName());
		n.setId(UUID.randomUUID().toString());
		if (type==NoticeStatus.PAYMENT_NODE.getCode()||type==NoticeStatus.PAYMENT_NODE.getCode()) {
			n.setAid(in.getFinanceId());
			bo.setAddress(in.getFinanceEmail());
		} else if(type==NoticeStatus.PAYMENT_NO.getCode()||type==NoticeStatus.PAYMENT_YES.getCode()
				||type==NoticeStatus.PAYMENT_COMPLETE.getCode()) {
			n.setAid(in.getTechId());
			bo.setAddress(in.getTechEmail());
		} 
		
		n.setNoticeType(type);
		n.setContent(str);
		n.setReaded(0);//未读
		noticeMapper.insertSelective(n);
		if(StringUtils.isNotBlank(a.getEmail())) {
			try {
				SendEmailUtil.getInstance().send(bo);
			} catch (UnsupportedEncodingException | MessagingException e) {
				e.printStackTrace();
			}
		}
	}


	@Override
	public boolean checkPayment(TOrderPayment p) {
		BigDecimal total=new BigDecimal(0);
		BigDecimal a=p.getApplicationAmount()==null?new BigDecimal(0):p.getApplicationAmount();
		List<outOrderPayment> list=new ArrayList<>();
		//支付种类 0第三方 1催款2官费
		if (p.getChooseType()==0) {
			//首先不能大于第三方
			list=tOrderPaymentMapper.selectList(p.getTpcId(),null,p.getChooseType());
		}else if (p.getChooseType()==1) {
			list=tOrderPaymentMapper.selectList(null,p.getNodeId(),p.getChooseType());
		}else if (p.getChooseType()==2) {
			list=tOrderPaymentMapper.selectList(p.getTpcId(),null,p.getChooseType());
		}
		for (outOrderPayment o : list) {
				a=a.add(new BigDecimal(o.getApplicationAmount()));	
		}
		if (p.getChooseType()==0) {
			ThirdPartyCompany t=thirdPartyCompanyMapper.selectByPrimaryKey(p.getTpcId());
			total=t.getTotalAmount();
		}else if (p.getChooseType()==1) {
			PaymentNode n=paymentNodeMapper.selectByPrimaryKey(p.getNodeId());
			total=n.getTotalAmount();
		}else if (p.getChooseType()==2) {
			OutThirdPartyCompany ot=thirdPartyCompanyMapper.selectByIdPuls(p.getTpcId());
			if (ot.getCostReduction()==0) {
				total=new BigDecimal(ot.getOfficialUnitPrice()).multiply(new BigDecimal(ot.getQuantity()));
			}else {
				total=new BigDecimal(ot.getReductionAmount()).multiply(new BigDecimal(ot.getQuantity()));
			}
		}
		if (a.compareTo(total) != 1) {
			return false;
		}
		return true;
	}


	@Override
	public boolean checkprojectDun(TOrderPayment p) {
		PaymentNode pn=paymentNodeMapper.selectByPrimaryKey(p.getNodeId());
		TOrderTaskDetailBo tt=tOrderTaskMapper.getOrderTaskDetail(p.getTid().toString());
//		项目状态 0-项目待提交 1-项目已提交，2-项目评审，3-项目立项，4-项目公示，5-项目抽查，6-项目备案，7-项目下证，8-项目验收，
//		9-项目拨款 10- 项目进度10% 11- 项目进度30% 12- 项目进度70%
		if(pn.getDunType()==1) {
			return false;
		}
		if (pn.getDunType()==0&&pn.getPartyTime().getTime()<new Date().getTime()) {//如果自定义则看触发时间
				return false;
		}else if (NewOrderDunType.CGZH_WC.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>7&&tt.getProjectStatus()<10)) {
			return false;
		}else if (NewOrderDunType.COMMON_NGS.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>3&&tt.getProjectStatus()<10)) {
			return false;
		}else if (NewOrderDunType.COMMON_XZ.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>6&&tt.getProjectStatus()<10)) {
			return false;
		} else if (NewOrderDunType.KJXM_LX.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>2&&tt.getProjectStatus()<10)) {
			return false;
		} else if (NewOrderDunType.KJXM_BK.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>8&&tt.getProjectStatus()<10)) {
			return false;
		} else if (NewOrderDunType.KJJR_BK.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>8&&tt.getProjectStatus()<10)) {
			return false;
		} else if (NewOrderDunType.RJKF_LX.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>2&&tt.getProjectStatus()<10)) {
			return false;
		} else if (NewOrderDunType.RJKF_WZ.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>7&&tt.getProjectStatus()<10)) {
			return false;
		}  else if (NewOrderDunType.ZSCQ_GS_SL_XZ.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())) {
			if (tt.getBpType()==1&&(tt.getProjectStatus()>7&&tt.getProjectStatus()<10)) {
				return false;
			}else if (tt.getBpType()!=1&&(tt.getProjectStatus()>3&&tt.getProjectStatus()<10)){
				return false;
			}
		}  else if (NewOrderDunType.ZSCQ_XZ.getCode()==Integer.valueOf(""+pn.getProjectType()+pn.getDunType())
				&&(tt.getProjectStatus()>6&&tt.getProjectStatus()<10)) {
			return false;
		}
			
		return true;
	}


	@SuppressWarnings("unchecked")
	@Override
	public Pagination<outPaymentList> selectPaymentList(InputPaymentList i) {
		Map<String, Object> map =new HashMap<>();
		map.put("aid", TokenManager.getAdminId());
		if (i.getContractNo()!=null)map.put("contractNo", i.getContractNo());
		if (i.getOrderNo()!=null)map.put("orderNo", i.getOrderNo());
		if (i.getUserName()!=null)map.put("userName", i.getUserName());
		if (i.getDepId()!=null)map.put("depId", i.getDepId());
		if (i.getAname()!=null)map.put("aname", i.getAname());
		if (i.getFinanceName()!=null)map.put("financeName", i.getFinanceName());
		if (i.getCname()!=null)map.put("cname", i.getCname());
		if (i.getPname()!=null)map.put("pname", i.getPname());
		if (i.getStatus()!=null)map.put("status", i.getStatus());
		if (TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)) {
			map.put("lvl", 1);
		}else if (TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)||TokenManager.hasRole(AFTConstants.VICE_CEO)||
				TokenManager.hasRole(AFTConstants.CED)||TokenManager.hasRole(AFTConstants.SUPERADMIN)||
				TokenManager.hasRole(AFTConstants.APPROVAL_DECISION)) {
			map.put("lvl", 2);
		}else  if (TokenManager.hasRole(AFTConstants.TECH)||TokenManager.hasRole(AFTConstants.TECH_MANAGER)) {
			map.put("lvl", 3);
		}else  {
			map.put("lvl", 0);
		}
		return (Pagination<outPaymentList>)findPage("selectPaymentList","selectPaymentCount",
				map,i.getPageNo(),i.getPageSize());
	}


	@SuppressWarnings("unchecked")
	@Override
	public Pagination<outNodeList> selectPaymentList(InputNodeList i) {
		Map<String, Object> map =new HashMap<>();
		map.put("aid", TokenManager.getAdminId());
		if (i.getContractNo()!=null)map.put("contractNo", i.getContractNo());
		if (i.getOrderNo()!=null)map.put("orderNo", i.getOrderNo());
		if (i.getUserName()!=null)map.put("userName", i.getUserName());
		if (i.getCname()!=null)map.put("cname", i.getCname());
		if (i.getPname()!=null)map.put("pname", i.getPname());
		if (i.getStatus()!=null)map.put("status", i.getStatus());
		if (i.getStartTime()!=null&&i.getEndTime()!=null) {
			map.put("startTime", DateUtils.StringToDate(i.getStartTime(), AFTConstants.YYYYMMDD));
			map.put("endTime", DateUtils.StringToDate(i.getEndTime()+" 23:59:59", AFTConstants.YYYYMMDDHHMMSS));
		}
		if (TokenManager.hasRole(AFTConstants.FINANCE)) {
			map.put("lvl", 1);
		}else if (TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)) {
			map.put("lvl", 2);
		}else if (TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)||TokenManager.hasRole(AFTConstants.VICE_CEO)||
					TokenManager.hasRole(AFTConstants.CED)||TokenManager.hasRole(AFTConstants.SUPERADMIN)||
					TokenManager.hasRole(AFTConstants.APPROVAL_DECISION)) {
				map.put("lvl", 3);
			}else  {
			map.put("lvl", 0);
		}
		return (Pagination<outNodeList>)findPage("selectNodeList","selectNodeCount",
				map,i.getPageNo(),i.getPageSize());
	}


	@Override
	public int insertSoftWritingPrice(SoftWritingPrice s) {
		return softWritingPriceMapper.insertSelective(s);
	}


	@Override
	public int updateSoftWritingPrice(SoftWritingPrice s) {
		//
		return softWritingPriceMapper.updateByPrimaryKeySelective(s);
	}
	@Override
	public Integer pushSelectByCid(String companyName,int i) {
		String aid=null;
		if (i==1) {
			aid=TokenManager.getAdminId();
		}
			List<Integer> list=companyLibraryMapper.selectName(companyName,i,aid);
			if (list.size()<1) {
				CompanyLibrary c=new CompanyLibrary();
				c.setCompanyName(companyName);
				c.setType(i);
				companyLibraryMapper.insertSelectiveGetId(c);
				return c.getId();
			}else {
				return list.get(0);
			}
		
	}


	@SuppressWarnings("unchecked")
	@Override
	public Pagination<SoftWritingPrice> listSoftWritingPrice(SoftWritingPrice s, Integer pageNo, Integer pageSize) {
		Map<String, Object> map =new HashMap<>();
		map.put("s", s);
		return (Pagination<SoftWritingPrice>)findPage("softWritingPriceList","softWritingPriceCount",
				map,pageNo,pageSize);
	}


	@Override
	public int deleteSoftWritingPrice(Integer id) {
		SoftWritingPrice sw=softWritingPriceMapper.selectByPrimaryKey(id);
		int i=softWritingPriceMapper.selectCountByCid(sw.getCid());
		if (i==1) {
			companyLibraryMapper.deleteByPrimaryKey(sw.getCid());
		}
		return softWritingPriceMapper.deleteByPrimaryKey(id);
	}


	@Override
	public boolean checkSoftWritingPrice(SoftWritingPrice s) {
		SoftWritingPrice sw=new SoftWritingPrice();
		if(s.getId()!=null)sw=softWritingPriceMapper.selectByPrimaryKey(s.getId());
		if (s.getId()!=null) {
			s.setCid(sw.getCid());
		}
		List<SoftWritingPrice>list=softWritingPriceMapper.checkSoftWritingPrice(s);
		if (list.size()<1) {
			return false;
		}else if (list.size()==1&&s.getId()!=null) {
				for (SoftWritingPrice ss : list) {
					if(ss.getId().equals(s.getId()))return false;
				}
		}
		return true;
	}


	@Override
	public Map<String ,Object> updateGroupPayment(String ids) {
		String [] idss=ids.split(",");
		List<Integer>elist=new ArrayList<>();
		List<Integer> list=new ArrayList<>();
		List<Notice> nlist=new ArrayList<>();
		Date date=new Date();
		for (String s : idss) {
			TOrderPayment top=tOrderPaymentMapper.selectByPrimaryKey(Integer.valueOf(s));
			if (top!=null&&top.getStatus()==1) {
				top.setStatus(3);
				top.setPaymentAmount(top.getApplicationAmount());
				tOrderPaymentMapper.updateByPrimaryKeySelective(top);
				list.add(top.getId());
				//做已付款金额计算
				confirmPayment(top);
				//发送站内通知
				Notice n =new Notice();
				n.setId(UUID.randomUUID().toString());
				NoticeInformationBo ni=financialPaymentMapper.selectBypidGetNotice(Integer.valueOf(s));
				AdminListBo a =adminMapper.getDeptNameByAid(TokenManager.getAdminId());
				n.setAid(ni.getTechId());
				n.setCreateTime(date);
				n.setNoticeType(NoticeStatus.PAYMENT_COMPLETE.getCode());
				String str=NoticeStatus.getValueByCode(n.getNoticeType())+": 订单编号 -"+ni.getOrderNo()+
						"，客户名称："+ni.getBuyerName()+"， 操作人:"+a.getName()+"-"+a.getDepartmentName()+"。";	
				n.setContent(str);
				n.setReaded(0);//未读
				nlist.add(n);
			}else {
				elist.add(Integer.valueOf(s));
			}
		}
		if(!nlist.isEmpty())noticeMapper.insertBatch(nlist);
//		if(!list.isEmpty())tOrderPaymentMapper.updateByids(list);
		Map<String ,Object> map=new HashMap<>();
		map.put("OK", list);
		map.put("fail", elist);
		return map;
	}


	@Override
	public int addOfficialFeePrice(OfficialFeePrice o) {
		return officialFeePriceMapper.insertSelective(o);
	}


	@Override
	public int updateOfficialFeePrice(OfficialFeePrice o) {
		return officialFeePriceMapper.updateByPrimaryKeySelective(o);
	}


	@Override
	public int deleteOfficialFeePrice(Integer id) {
		return officialFeePriceMapper.deleteByPrimaryKey(id);
	}


	@Override
	public List<OfficialFeePrice> listOfficialFeePrice(String name) {
		return officialFeePriceMapper.selectListByname(name);
	}


	@Override
	public int deleteFinancialPayment(Integer id) {
		return financialPaymentMapper.deleteByPrimaryKey(id);
	}


	@Override
	public void calculationUnitPrice(ThirdPartyCompany t) {
		SoftWritingPrice s=new SoftWritingPrice();
		s.setCid(t.getCid());
		s.setMaterial(t.getMaterial());
		s.setUrgent(t.getUrgent());
		List<SoftWritingPrice> list=softWritingPriceMapper.checkSoftWritingPrice(s);
		for (SoftWritingPrice sw : list) {
			t.setUnitPrice(sw.getUnitPrice());
			t.setTotalAmount(sw.getUnitPrice().multiply(new BigDecimal(t.getQuantity())));
		}
	}
	
	@Override
	public void calculationPatentUnitPrice(ThirdPartyCompany t) {
		PatentPrice p=patentPriceMapper.selectBycid(t.getCid());
//		专利名称 0实用新型 1发明专利 2外观专利 3 其他
		BigDecimal unitPrice=null;
		if (t.getPatentNameType()==0) {
			unitPrice=p.getUtilityModel();
		}else if (t.getPatentNameType()==1) {
			unitPrice=p.getInventionPatent();
		}else if (t.getPatentNameType()==2) {
			unitPrice=p.getAppearancePatent();
		}
		t.setUnitPrice(unitPrice);
		t.setTotalAmount(unitPrice.multiply(new BigDecimal(t.getQuantity())));
	}


	@Override
	public int addpatentPrice(PatentPrice p) {
		return patentPriceMapper.insertSelective(p);
	}


	@Override
	public int updatepatentPrice(PatentPrice p) {
		return patentPriceMapper.updateByPrimaryKeySelective(p);
	}


	@Override
	public int deletepatentPrice(Integer id) {
		PatentPrice pp=patentPriceMapper.selectByPrimaryKey(id);
		if (pp.getCid()!=null) {
			companyLibraryMapper.deleteByPrimaryKey(pp.getCid());
		}
		return patentPriceMapper.deleteByPrimaryKey(id);
	}

	@Override
	public List<PatentPrice> listpatentPrice(String name) {
		return patentPriceMapper.selectlist(name);
	}

	@Override
	public boolean addCompanyChekeNumber(ThirdPartyCompany t) {
		TOrderTask tt=tOrderTaskMapper.selectByPrimaryKey(t.getTid());
		 List<OutThirdPartyCompany> list =thirdPartyCompanyMapper.selectByTid(t.getTid());
		 Integer count=t.getQuantity();
		 for (OutThirdPartyCompany out : list) {
			if (t.getId()==null||!t.getId().equals(out.getId())) {
				count+=out.getQuantity();
			}
		}
		if (tt.getCommodityQuantity()>=count) {
			return false;
		}
		return true;
	}
	
	@Override
	public void checkGetAmount(TOrderPayment p) {
		if(p.getApplicationAmount()==null) {
			BigDecimal count=new BigDecimal(0);
			if(p.getChooseType()==0) {
				ThirdPartyCompany tpc=thirdPartyCompanyMapper.selectByPrimaryKey(p.getTpcId());
				count=tpc.getUnitPrice().multiply(new BigDecimal(p.getQuantity()));
			}
			if (p.getChooseType()==2) {
				OutThirdPartyCompany ot=thirdPartyCompanyMapper.selectByIdPuls(p.getTpcId());
				if (ot.getCostReduction()==0) {
					count=new BigDecimal(ot.getOfficialUnitPrice()).multiply(new BigDecimal(ot.getQuantity()));
				}else {
					count=new BigDecimal(ot.getReductionAmount()).multiply(new BigDecimal(ot.getQuantity()));
				}
			}
			p.setApplicationAmount(count);
		}
		
	}





	@Override
	public void exportPaymentList(HttpServletResponse response, InputPaymentList ip) throws IOException {
		OutputStream out = response.getOutputStream();
		try {
			@SuppressWarnings("unchecked")
			List<outPaymentList> list=(List<outPaymentList>) selectPaymentList(ip).getList();
			//支付编号	项目编号	项目名称	项目状态	分类名称	合同编号	订单编号	客户名称	部门名称	付款类型	本次申请金额	已支付	申请人	财务名称	状态	创建时间
    		String[] comment = {"支付编号","项目编号","项目名称","项目状态","分类名称","合同编号","订单编号","客户名称","部门名称","第三方机构名称","付款类型","本次申请金额",
    				"已支付","申请人","财务名称","状态","创建时间"};
    		String fileName ="财务成本列表" + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()) + ".xls";
    		//type 0 变更
    		XSSFWorkbook wb =ExportExcelUtil.exportTemplateInfoS(comment,"财务成本列表");
    		//根据列表编写文档
    		XSSFSheet sheet =wb.getSheetAt(0);
    		for (outPaymentList ob : (List<outPaymentList>)list) {
    			//新增一行
    			XSSFRow r = sheet.createRow(sheet.getLastRowNum()+1);
    			for (int i = 0; i < comment.length; i++) {
    				//当前列的只
    				String o = "";
    				switch (comment[i]) {
//    "支付编号","项目编号","项目名称","项目状态","分类名称","合同编号","订单编号","客户名称","部门名称","第三方机构名称","付款类型","本次申请金额",
//    				"已支付","申请人","财务名称","状态","创建时间"
    				case "支付编号": o = ob.getId().toString(); break;
    				case "项目编号": o = ob.getTid().toString(); break;
    				case "项目名称": o = ob.getPname(); break;
    				case "项目状态": o = ProjectNewStage.getValueByCode(ob.getProjectStatus()); break;
    				case "分类名称": o = ob.getCname(); break;
    				case "合同编号": o = ob.getContractNo(); break;
    				case "订单编号": o = ob.getOrderNo(); break;
    				case "客户名称": o = ob.getCname(); break;
    				case "部门名称": o = ob.getDepName(); break;
    				case "第三方机构名称": o = ob.getCname(); break;
    				case "付款类型": o = ob.getChooseType()==0?"第三方成本":
    						ob.getChooseType()==1?"催款节点":ob.getChooseType()==2?"官费":""; 
    					break;
    				case "本次申请金额": o = ob.getApplicationAmount().toString(); break;
    				case "已支付": o = ob.getPaymentAmount(); break;
    				case "申请人": o = ob.getAname(); break;
    				case "财务名称": o = ob.getFinanceName(); break;
    				case "状态": o = ob.getStatus()==0?"审核":ob.getStatus()==1?"待支付":
    						ob.getStatus()==2?"驳回":ob.getStatus()==3?"已支付":
    							ob.getStatus()==4?"已取消":"";
    					break;
    				case "创建时间": o = ob.getCreateTime(); break;
    				default: o = ""; break;
    				}
    				XSSFCell c = r.createCell(i);
    				c.setCellValue(o);
    			}
    		}
    		//返回名称及参数
			 response.addHeader("Content-Disposition", "attachment;filename="  + new String(fileName.getBytes(),"iso-8859-1"));  
			 response.setContentType("application/octet-stream;charset=utf-8");
    		 // 返回数据流
			 wb.write(out); 
			 out.flush();
			 out.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new BusinessException(new Error("表格生成错误。"));
		}finally {
			out.flush(); 
			 out.close(); 
		}
		
	}
}
