package com.yaochen.boss.job.component; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.yaochen.boss.commons.InvalidMath; import com.yaochen.boss.commons.LoggerUtil; import com.yaochen.boss.dao.BusiDao; import com.yaochen.boss.dao.CProdInvalidUpdateDao; import com.yaochen.boss.dao.JobDao; import com.yaochen.boss.job.BusiCfgDataJob; import com.yaochen.boss.model.CProdCycleDto; import com.yaochen.boss.model.CProdUpdate; import com.ycsoft.beans.config.TAcctitemToProd; import com.ycsoft.beans.config.TConfigTemplate; import com.ycsoft.beans.core.acct.CAcct; import com.ycsoft.beans.core.acct.CAcctAcctitem; import com.ycsoft.beans.core.acct.CAcctAcctitemActive; import com.ycsoft.beans.core.acct.CAcctAcctitemChange; import com.ycsoft.beans.core.acct.CAcctAcctitemInactive; import com.ycsoft.beans.core.acct.CAcctPreFee; import com.ycsoft.beans.core.bank.CBankAgree; import com.ycsoft.beans.core.bank.CBankGotodisk; import com.ycsoft.beans.core.bank.CBankRefundtodisk; import com.ycsoft.beans.core.bank.CBankReturn; import com.ycsoft.beans.core.bank.CBankReturnPayerror; import com.ycsoft.beans.core.bill.BTaskInfo; import com.ycsoft.beans.core.cust.CCust; import com.ycsoft.beans.core.fee.CFee; import com.ycsoft.beans.core.job.JBusiCmd; import com.ycsoft.beans.core.job.JCustAcctmodeCal; import com.ycsoft.beans.core.job.JCustCreditCal; import com.ycsoft.beans.core.job.JCustInvalidCal; import com.ycsoft.beans.core.job.JCustWriteoff; import com.ycsoft.beans.core.job.JProdNextTariff; import com.ycsoft.beans.core.job.JProdPreopen; import com.ycsoft.beans.core.job.JSmsRecord; import com.ycsoft.beans.core.job.JUserStop; import com.ycsoft.beans.core.prod.CProd; import com.ycsoft.beans.core.prod.CProdInclude; import com.ycsoft.beans.core.prod.CProdPropChange; import com.ycsoft.beans.core.prod.CProdPropPat; import com.ycsoft.beans.core.promotion.CPromotion; import com.ycsoft.beans.core.user.CUser; import com.ycsoft.beans.core.user.CUserPropChange; import com.ycsoft.beans.prod.PProdTariff; import com.ycsoft.beans.system.SCounty; import com.ycsoft.beans.system.SOptr; import com.ycsoft.business.commons.pojo.BusiParameter; import com.ycsoft.business.component.config.ExpressionUtil; import com.ycsoft.business.dao.core.acct.CAcctAcctitemChangeDao; import com.ycsoft.business.dao.core.acct.CAcctAcctitemDao; import com.ycsoft.business.dao.core.bank.CBankAgreeDao; import com.ycsoft.business.dao.core.bank.CBankGotodiskDao; import com.ycsoft.business.dao.core.bank.CBankRefundtodiskDao; import com.ycsoft.business.dao.core.bank.CBankReturnDao; import com.ycsoft.business.dao.core.bank.CBankReturnPayerrorDao; import com.ycsoft.business.dao.core.bill.BTaskInfoDao; import com.ycsoft.business.dao.core.cust.CCustDao; import com.ycsoft.business.dao.core.fee.CFeeDao; import com.ycsoft.business.dao.core.job.JBusiCmdDao; import com.ycsoft.business.dao.core.job.JCustCreditCalDao; import com.ycsoft.business.dao.core.job.JCustInvalidCalDao; import com.ycsoft.business.dao.core.job.JCustWriteoffDao; import com.ycsoft.business.dao.core.job.JSmsRecordDao; import com.ycsoft.business.dao.core.prod.CProdDao; import com.ycsoft.business.dao.core.prod.CProdPropChangeDao; import com.ycsoft.business.dao.core.prod.CProdPropPatDao; import com.ycsoft.business.dao.core.user.CUserAtvDao; import com.ycsoft.business.dao.core.user.CUserBroadbandDao; import com.ycsoft.business.dao.core.user.CUserDao; import com.ycsoft.business.dao.core.user.CUserDtvDao; import com.ycsoft.business.dao.prod.PProdTariffDao; import com.ycsoft.business.dao.system.SCountyDao; import com.ycsoft.business.dto.config.TemplateConfigDto; import com.ycsoft.business.dto.core.acct.AcctitemDto; import com.ycsoft.business.dto.core.acct.BankReturnDto; import com.ycsoft.business.dto.core.cust.CustFullInfoDto; import com.ycsoft.business.dto.core.prod.CProdDto; import com.ycsoft.business.dto.core.prod.PPromotionDto; import com.ycsoft.business.dto.core.prod.ProdRes; import com.ycsoft.business.service.externalImpl.IAcctServiceExternal; import com.ycsoft.business.service.externalImpl.ICustServiceExternal; import com.ycsoft.business.service.externalImpl.IUserProdServiceExternal; import com.ycsoft.business.service.externalImpl.IUserServiceExternal; import com.ycsoft.commons.abstracts.BaseComponent; import com.ycsoft.commons.constants.BusiCmdConstants; import com.ycsoft.commons.constants.BusiCodeConstants; import com.ycsoft.commons.constants.SequenceConstants; import com.ycsoft.commons.constants.StatusConstants; import com.ycsoft.commons.constants.SystemConstants; import com.ycsoft.commons.exception.ComponentException; import com.ycsoft.commons.helper.CollectionHelper; import com.ycsoft.commons.helper.DateHelper; import com.ycsoft.commons.helper.LoggerHelper; import com.ycsoft.commons.helper.StringHelper; import com.ycsoft.commons.store.AcctItemToProdConfig; import com.ycsoft.commons.store.TemplateConfig; import com.ycsoft.commons.store.TemplateConfig.Template; import com.ycsoft.daos.core.DataHandler; import com.ycsoft.daos.core.JDBCException; @Component public class BusiComponent { private final Logger logger = LoggerFactory.getLogger(getClass()); private IUserServiceExternal userService; private IAcctServiceExternal acctService; private IUserProdServiceExternal userProdService; private ICustServiceExternal custService; private BusiDao busiDao; private JobDao jobDao; private CCustDao cCustDao; private CProdDao cProdDao; private CUserDao cUserDao; private CFeeDao cFeeDao; private CAcctAcctitemDao cAcctAcctitemDao; private CAcctAcctitemChangeDao cAcctAcctitemChangeDao; private CUserAtvDao cUserAtvDao; private CUserDtvDao cUserDtvDao; private CUserBroadbandDao cUserBroadbandDao; private CProdInvalidUpdateDao cProdInvalidUpdateDao; private JBusiCmdDao jBusiCmdDao; private SCountyDao sCountyDao; private PProdTariffDao pProdTariffDao; private JCustCreditCalDao jCustCreditCalDao; private BTaskInfoDao bTaskInfoDao; private ExpressionUtil expressionUtil ; private CProdPropChangeDao cProdPropChangeDao; private JSmsRecordDao jSmsRecordDao; private CProdPropPatDao cProdPropPatDao; private JCustWriteoffDao jCustWriteoffDao; private JCustInvalidCalDao jCustInvalidCalDao; private CBankAgreeDao cBankAgreeDao; private CBankGotodiskDao cBankGotodiskDao; private CBankReturnDao cBankReturnDao; private CBankRefundtodiskDao cBankRefundtodiskDao; private CBankReturnPayerrorDao cBankReturnPayerrorDao; /** * 取一个客户的所有常和预开通产品信息(非子产品) 0.如果基础且资费是包月的产品信息(无手工变更有效记录)的账目使用级别根据模板配置判断,符合则改成 账目使用级别=NONE 否则改成ALL。 基础产品中0资费、包多月资费改成NONE 基础产品且实时点播资费不做任何修改 1.包月非0资费的正常产品不使用公用或者公用无钱,则 按到期日停 ,否则按账务模式停; 2.包月非0资费的其他状态产品 则按账务模式停 3.包月非0资费产品状态是欠费停或欠费未停,停机账务模式、到期日大于当天、余额<=0 则修改到期日为当天。 4.账目使用级别变化和因公用有钱引起的停机模式T=>F,需要重新插入销账重新预约和到期日计算JOB。 5.包月非0资费产品停机模式F=>T,需要按余额计算到期日 */ public void calAcctmode(JCustAcctmodeCal acctmodecal) throws Exception{ String custId=acctmodecal.getCust_id(); String countyId=acctmodecal.getCounty_id(); //提取一个客户的需要计费模式判断的产品(不含子产品,只提取资费包月且按月计费的产品) List<CProdDto> cprods=cProdDao.queryAllAcctModeProd(custId, countyId); //产品账目的有效手工变更记录 Map<String,CProdPropPat> patMap= CollectionHelper.converToMapSingle(cProdPropPatDao.queryPatsByCustId(custId),"prod_sn"); //一个客户的所有公用账目 Map<String,CAcctAcctitem> pubAcctItemMap=null; List<CProdPropChange> propChangeList = new ArrayList<CProdPropChange>();//异动记录临时保存 List<CProd> prodUpdateList=new ArrayList<CProd>();//产品更新临时保存 boolean needWrite=false; for(CProdDto cprod:cprods){ //0步骤判断,根据模板配置产品的公用账目使用级别 String public_acctitem_type=cprod.getPublic_acctitem_type(); if(cprod.getBilling_cycle()>1||cprod.getTariff_rent()==0){ //产品是包多资费月产品和0资费产品,账目使用级别强制为NONE public_acctitem_type=SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE; }else if(!patMap.containsKey(cprod.getProd_sn())&&cprod.getIs_base().equals(SystemConstants.BOOLEAN_TRUE)){ //无手工账目使用级别变更记录的基本产品判断 //提取模板中默认不使用公用账目配置 String specAcctitemFlag = queryTemplateConfig(TemplateConfigDto.Config.PROD_PUBLIC_TYPE.toString(),countyId); //值:BAND,F;ITV,F;ATV,T if(StringHelper.isNotEmpty(specAcctitemFlag) && specAcctitemFlag.indexOf(cprod.getServ_id())>-1){ public_acctitem_type=SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE; } //提取模板中的例外产品配置 String baseprodNoFlag = queryTemplateConfig(TemplateConfigDto.Config.PROD_NONE_PUBLIC_TYPE.toString(),countyId); //值:2728;2729 if(StringHelper.isNotEmpty(baseprodNoFlag) && baseprodNoFlag.indexOf(cprod.getProd_id())>-1){ public_acctitem_type=SystemConstants.PUBLIC_ACCTITEM_TYPE_ALL; } //提取模板中的明细产品配置 String baseprodNoneFlag = queryTemplateConfig(TemplateConfigDto.Config.PROD_PUBLIC_TYPE_DETAIL.toString(),countyId); //值:2728;2729 if(StringHelper.isNotEmpty(baseprodNoneFlag) && baseprodNoneFlag.indexOf(cprod.getProd_id())>-1){ public_acctitem_type=SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE; } } if(!public_acctitem_type.equals(cprod.getPublic_acctitem_type())){ needWrite=true; //记录异动 更新表数据 CProd prod=new CProd(); prod.setProd_sn(cprod.getProd_sn()); prod.setPublic_acctitem_type(public_acctitem_type); prodUpdateList.add(prod); CProdPropChange prop = new CProdPropChange(); prop.setProd_sn(cprod.getProd_sn()); prop.setColumn_name("PUBLIC_ACCTITEM_TYPE"); prop.setOld_value(cprod.getPublic_acctitem_type()); prop.setNew_value(public_acctitem_type); propChangeList.add(prop); cprod.setPublic_acctitem_type(public_acctitem_type); } //只处理按月计费产品和非模拟 //1,2 步骤 包月非0资费正常产品 不使用公用或公用无钱则 按到期日停,其他情况都按账务模式停 if(cprod.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH) &&!cprod.getServ_id().equals(SystemConstants.PROD_SERV_ID_ATV)){ String acctmode=null; //1.包月资费正常产品判断停机模式 if(cprod.getBilling_cycle()==1&&cprod.getTariff_rent()>0){ //账目使用级别判断 if(cprod.getStatus().equals(StatusConstants.ACTIVE)&&cprod.getPublic_acctitem_type().equals(SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE)){ //包月资费状态正常 账目使用NONE的产品 acctmode=SystemConstants.BOOLEAN_TRUE; }else if(cprod.getStatus().equals(StatusConstants.ACTIVE)&&!cprod.getPublic_acctitem_type().equals(SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE)){ //包月资费状态正常 账目使用非NONE的产品 acctmode=SystemConstants.BOOLEAN_TRUE; if(pubAcctItemMap==null){ pubAcctItemMap=CollectionHelper.converToMapSingle(cAcctAcctitemDao.queryPubAcctItemsByCustId(custId, countyId),"acctitem_id"); } for(TAcctitemToProd aitp: AcctItemToProdConfig.loadConfig(cprod.getProd_id())){ //可使用的公用有活动余额 if(pubAcctItemMap.containsKey(aitp.getAcctitem_id())&&pubAcctItemMap.get(aitp.getAcctitem_id()).getActive_balance()>0){ if( cprod.getPublic_acctitem_type().equals(SystemConstants.PUBLIC_ACCTITEM_TYPE_PUBLIC_ONLY) &&aitp.getAcctitem_id().equals(SystemConstants.ACCTITEM_PUBLIC_ID)){ //账目使用级别判断 只能使用公用 acctmode=SystemConstants.BOOLEAN_FALSE; break; }else if(cprod.getPublic_acctitem_type().equals(SystemConstants.PUBLIC_ACCTITEM_TYPE_SPEC_ONLY) &&!aitp.getAcctitem_id().equals(SystemConstants.ACCTITEM_PUBLIC_ID)){ //账目使用级别判断 只能使用专项公用 acctmode=SystemConstants.BOOLEAN_FALSE; break; }else if(cprod.getPublic_acctitem_type().equals(SystemConstants.PUBLIC_ACCTITEM_TYPE_ALL)){ //账目使用基本 ALL acctmode=SystemConstants.BOOLEAN_FALSE; break; } } } //步骤4:公用账务有余额引起的停机T=>F,需要插入销账和到期日计算 if(!cprod.getStop_by_invalid_date().equals(acctmode)&&acctmode.equals(SystemConstants.BOOLEAN_FALSE)){ needWrite=true; } }else{//包月资费产品其他状态一律按账务模式停机 acctmode=SystemConstants.BOOLEAN_FALSE; } }else{//0资费和包多月资费 acctmode=SystemConstants.BOOLEAN_TRUE; } //账务模式发生了改变 if(!cprod.getStop_by_invalid_date().equals(acctmode)){ CProd updateprod=new CProd(); updateprod.setProd_sn(cprod.getProd_sn()); updateprod.setStop_by_invalid_date(acctmode); prodUpdateList.add(updateprod); //步骤5:账务模式F=>T的产品,重算到期日(只有正常的包月资费产品才会F=>T) if(SystemConstants.BOOLEAN_TRUE.equals(acctmode)&&cprod.getStatus().equals(StatusConstants.ACTIVE) &&cprod.getBilling_cycle()==1&&cprod.getTariff_rent()>0){ Date invaliddate=DateHelper.today(); if(cprod.getBillinfo_eff_date()!=null&&cprod.getBillinfo_eff_date().after(invaliddate)){ //开始计费日期大于当天 invaliddate=cprod.getBillinfo_eff_date(); } invaliddate=BaseComponent.getInvalidDateByAcctmode(invaliddate, cprod.getAll_balance()-cprod.getOwe_fee()-cprod.getReal_bill(), cprod.getTariff_rent(), cprod.getBilling_cycle()); if(!DateHelper.dateToStr(invaliddate).equals(DateHelper.dateToStr(cprod.getInvalid_date()))){ //新计算出来的到期日和产品到期日不一致,则更新到期日,并记录异动 CProdPropChange prop = new CProdPropChange(); prop.setProd_sn(cprod.getProd_sn()); prop.setColumn_name("INVALID_DATE"); prop.setOld_value(DateHelper.dateToStr(cprod.getInvalid_date())); prop.setNew_value(DateHelper.dateToStr(invaliddate)); propChangeList.add(prop); cprod.setInvalid_date(invaliddate); updateprod.setInvalid_date(invaliddate); } } CProdPropChange prop = new CProdPropChange(); prop.setProd_sn(cprod.getProd_sn()); prop.setColumn_name("STOP_BY_INVALID_DATE"); prop.setOld_value(cprod.getStop_by_invalid_date()); prop.setNew_value(acctmode); propChangeList.add(prop); cprod.setStop_by_invalid_date(acctmode); } //步骤3 包月的欠费停或者欠费未停的包月资费账务停机产品,如果账目无余额到期日大于当天,则修改到期日为当天 if((cprod.getStatus().equals(StatusConstants.OWESTOP)||cprod.getStatus().equals(StatusConstants.OWENOTSTOP)) &&cprod.getStop_by_invalid_date().equals(SystemConstants.BOOLEAN_FALSE)&&cprod.getInvalid_date().after(new Date())) { int now_fee=cprod.getAll_balance()-cprod.getOwe_fee()-cprod.getReal_bill(); if(now_fee<=0){ Date invaliddate=DateHelper.today(); if(!DateHelper.dateToStr(invaliddate).equals(DateHelper.dateToStr(cprod.getInvalid_date()))){ //新计算出来的到期日和产品到期日不一致,则更新到期日,并记录异动 CProdPropChange prop1 = new CProdPropChange(); prop1.setProd_sn(cprod.getProd_sn()); prop1.setColumn_name("INVALID_DATE"); prop1.setOld_value(DateHelper.dateToStr(cprod.getInvalid_date())); prop1.setNew_value(DateHelper.dateToStr(invaliddate)); propChangeList.add(prop1); cprod.setInvalid_date(invaliddate); CProd updateprod=new CProd(); updateprod.setProd_sn(cprod.getProd_sn()); prodUpdateList.add(updateprod); updateprod.setInvalid_date(invaliddate); } } } } } //更新产品保存 cProdDao.update(prodUpdateList.toArray(new CProd[prodUpdateList.size()])); //异动保存 for(CProdPropChange prop: propChangeList){ prop.setCounty_id(acctmodecal.getCounty_id()); prop.setArea_id(acctmodecal.getArea_id()); prop.setDone_code(acctmodecal.getDone_code()); } cProdPropChangeDao.save(propChangeList.toArray(new CProdPropChange[propChangeList.size()])); //步骤4执行 if(needWrite){ JCustWriteoff creditCal=new JCustWriteoff(); creditCal.setJob_id(acctmodecal.getJob_id()); creditCal.setDone_code(acctmodecal.getDone_code()); creditCal.setCust_id(custId); creditCal.setCounty_id(countyId); creditCal.setArea_id(acctmodecal.getArea_id()); //TODO-应该插入特殊销账 creditCal.setWriteoff(SystemConstants.BOOLEAN_TRUE); jCustWriteoffDao.save(creditCal); //到期日计算JOB JCustInvalidCal invalidCal = new JCustInvalidCal(); invalidCal.setJob_id(acctmodecal.getJob_id()); invalidCal.setCust_id(custId); invalidCal.setDone_code(acctmodecal.getDone_code()); invalidCal.setArea_id(acctmodecal.getArea_id()); invalidCal.setCounty_id(acctmodecal.getCounty_id()); jCustInvalidCalDao.save(invalidCal); } } public String queryTemplateConfig(String key,String countyId) throws ComponentException{ TemplateConfigDto t = (TemplateConfigDto) TemplateConfig.loadConfig( Template.CONFIG,countyId); TConfigTemplate template = t.get(key); if (template == null) return null; return template.getConfig_value(); } public List<CCust> queryCustWithInvalidCustClass()throws Exception{ return jobDao.queryCustWithInvalidCustClass(); } public void resumeCustClass(CCust cust)throws Exception{ CustFullInfoDto cfd = new CustFullInfoDto(); cfd.setCust(cust); SOptr optr = gOptr(cust.getArea_id(),cust.getCounty_id()); BusiParameter p = new BusiParameter(); p.setOptr(optr); p.setCustFullInfo(cfd); p.setBusiCode(BusiCodeConstants.CUST_CLASS_EDIT); custService.resumeCustClass(p); } /** * 预开通 * @param dto * @param preopen * @throws Exception */ public void preOpen(CProdDto dto,JProdPreopen preopen) throws Exception{ if(dto==null) throw new Exception("预开通("+preopen.getJob_id()+") 产品不存在."); if(dto.getStatus().equals(StatusConstants.PREAUTHOR)){ //变更状态 /*CProd prod=new CProd(); prod.setProd_sn(dto.getProd_sn()); prod.setStatus(StatusConstants.ACTIVE); prod.setStatus_date(new Date()); prod.setPre_open_time(null); cProdDao.update(prod);*/ cProdDao.updatePreOpenTime(dto.getProd_sn()); //插入状态异动 List<CProdPropChange> propList = new ArrayList<CProdPropChange>(); CProdPropChange pchange=new CProdPropChange(); pchange.setArea_id(preopen.getArea_id()); pchange.setCounty_id(preopen.getCounty_id()); pchange.setDone_code(Integer.parseInt(preopen.getDone_code())); pchange.setChange_time(new Date()); pchange.setProd_sn(preopen.getProd_sn()); pchange.setColumn_name("status"); pchange.setOld_value(StatusConstants.PREAUTHOR); pchange.setNew_value(StatusConstants.ACTIVE); propList.add(pchange); pchange=new CProdPropChange(); pchange.setArea_id(preopen.getArea_id()); pchange.setCounty_id(preopen.getCounty_id()); pchange.setDone_code(Integer.parseInt(preopen.getDone_code())); pchange.setChange_time(new Date()); pchange.setProd_sn(preopen.getProd_sn()); pchange.setColumn_name("pre_open_time"); pchange.setOld_value(DateHelper.dateToStr(dto.getPre_open_time())); pchange.setNew_value(null); propList.add(pchange); cProdPropChangeDao.save(propList.toArray(new CProdPropChange[propList.size()])); }else if(!dto.getStatus().equals(StatusConstants.ACTIVE)){ throw new Exception("预开通("+preopen.getJob_id()+") 用户名下产品状态异常."); } List<CProdDto> childProds = cProdDao.queryChildProdByPkgsn(dto.getProd_sn(), dto.getCounty_id()); if(childProds.size() > 0){ //套餐,修改子产品状态,发加授权 for(CProdDto prod : childProds){ LoggerHelper.info(BusiComponent.class, "原产品prod_sn: "+prod.getProd_sn()+"原产品状态: "+prod.getStatus()); CProd cp=new CProd(); cp.setProd_sn(prod.getProd_sn()); cp.setStatus(StatusConstants.ACTIVE); cp.setStatus_date(new Date()); cp.setPre_open_time(null); cProdDao.update(cp); LoggerHelper.info(BusiComponent.class, "新产品prod_sn: "+cp.getProd_sn()+"新产品状态: "+cp.getStatus()); //插入开通指令 JBusiCmd busiCmdJob = new JBusiCmd(); busiCmdJob.setJob_id(getJobId()); busiCmdJob.setDone_code(Integer.parseInt(preopen.getDone_code())); busiCmdJob.setBusi_cmd_type(BusiCmdConstants.ACCTIVATE_PROD); busiCmdJob.setCust_id(prod.getCust_id()); busiCmdJob.setUser_id(prod.getUser_id()); busiCmdJob.setStb_id(dto.getStb_id()); busiCmdJob.setCard_id(dto.getCard_id()); busiCmdJob.setModem_mac(dto.getModem_mac()); busiCmdJob.setProd_sn(prod.getProd_sn()); busiCmdJob.setArea_id(prod.getArea_id()); busiCmdJob.setCounty_id(prod.getCounty_id()); busiCmdJob.setPriority(SystemConstants.PRIORITY_SSSQ); busiCmdJob.setProd_id(prod.getProd_id()); jBusiCmdDao.save(busiCmdJob); } }else{ //插入开通指令 JBusiCmd busiCmdJob = new JBusiCmd(); busiCmdJob.setJob_id(getJobId()); busiCmdJob.setDone_code(Integer.parseInt(preopen.getDone_code())); busiCmdJob.setBusi_cmd_type(BusiCmdConstants.ACCTIVATE_PROD); busiCmdJob.setCust_id(dto.getCust_id()); busiCmdJob.setUser_id(dto.getUser_id()); busiCmdJob.setStb_id(dto.getStb_id()); busiCmdJob.setCard_id(dto.getCard_id()); busiCmdJob.setModem_mac(dto.getModem_mac()); busiCmdJob.setProd_sn(dto.getProd_sn()); busiCmdJob.setArea_id(dto.getArea_id()); busiCmdJob.setCounty_id(dto.getCounty_id()); busiCmdJob.setPriority(SystemConstants.PRIORITY_SSSQ); busiCmdJob.setProd_id(dto.getProd_id()); jBusiCmdDao.save(busiCmdJob); } } public void userStop(JUserStop stopJob) throws Exception{ } /** * 更新一个客户的使用公用账目的产品的到期日 * @param cust_id * @param doneCode */ public void updateCprodInvalid(String cust_id,String county_id, Integer doneCode)throws Exception{ //按公用账目数取产品集合 List<CProdUpdate> list= cProdInvalidUpdateDao.queryCProdUpdates(cust_id, county_id); Map<String,CProdCycleDto> cprodmp=new HashMap<String,CProdCycleDto>(); for(CProdUpdate cu:list){ //使用其他计算后的到期日值更新当次到期日计算初始值 for(CProdCycleDto dto:cu.getCprods()){ if(cprodmp.containsKey(dto.getProd_sn())) dto.setInvalid_date_num(cprodmp.get(dto.getProd_sn()).getInvalid_date_num()); } InvalidMath.doMath(cu); for(CProdCycleDto dto:cu.getCprods()){ cprodmp.put(dto.getProd_sn(), dto); } } //取不存在的最后一个计算过程中的产品集合 //更新到期日 cProdInvalidUpdateDao.updateCprod(cprodmp,doneCode); //处理非公用到期日计算 List<CProdCycleDto> canprods=cProdInvalidUpdateDao.queryCProdCanManthInvalid(cust_id, county_id); for(CProdCycleDto o:canprods){ //排除公用计算过的产品 if(!cprodmp.containsKey(o.getProd_sn())) cProdInvalidUpdateDao.updateOneProdInavlid(o, doneCode); } //更新状态=不计费的产品的到期日即被包含的产品=主产品的到期日 //包月不计费产品到期日=主产品到期日+专用账目可看时间 for(CProdCycleDto o: cProdInvalidUpdateDao.queryCProdPaushInvalid(cust_id,county_id)){ cProdInvalidUpdateDao.updateOneProdInavlid(o, doneCode); } } /** * 修改资费 * @param tariffJob * @throws Exception */ public void changeTariff(JProdNextTariff tariffJob) throws Exception{ SOptr optr = gOptr(tariffJob.getArea_id(),tariffJob.getCounty_id()); BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.PROD_CHANGE_TARIFF); p.setOptr(optr); userProdService.changeTariff(p,tariffJob.getProd_sn(), tariffJob.getTariff_id(),DateHelper.dateToStr(tariffJob.getEff_date()),null); LoggerUtil.PrintInfo(this.getClass(),"资费变更","产品【"+tariffJob.getProd_sn()+"】资费变更为"+tariffJob.getTariff_id()); } public void changeFzdProdTariff(CProd prod) throws Exception{ SOptr optr = gOptr(prod.getArea_id(),prod.getCounty_id()); BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.PROD_CHANGE_TARIFF); p.setOptr(optr); //修改资费,变为6元每月 userProdService.changeTariff(p,prod.getProd_sn(), "4119",DateHelper.formatNow(),null); LoggerUtil.PrintInfo(this.getClass(),"资费变更","产品【"+prod.getProd_sn()+"】资费变更为4119"); } public void changeDeviceOwnership(String deviceId,String countyId,String areaId) throws Exception{ SOptr optr = gOptr(areaId,countyId); BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.CHANGE_OWNERSHIP); p.setOptr(optr); //修改设备产权 custService.saveChangeOwnership(p, deviceId); LoggerUtil.PrintInfo(this.getClass(),"产权变更","设备【"+deviceId+"】变更为个人"); } /** * 修改产品公用账目使用类型 * @param prod * @throws Exception */ public void changeProdPubAcctType(CProd prod) throws Exception{ CProdPropChange change = new CProdPropChange("public_acctitem_type",prod.getPublic_acctitem_type(),SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE); List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); changeList.add(change); SOptr optr = gOptr(prod.getArea_id(),prod.getCounty_id()); BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.PROD_CHANGE_PUBACCTTYPE); p.setOptr(optr); userProdService.saveEditProd(p,prod.getProd_sn(), changeList); LoggerUtil.PrintInfo(this.getClass(),"公用账目使用类型变更","产品【"+prod.getProd_sn()+"】公用账目使用类型变更为"+SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE); } /** * 处理预报停 * @param stopJob * @throws Exception */ public void userRequireStop(JUserStop stopJob) throws Exception { BusiParameter p = new BusiParameter(); CUser user = cUserDao.findByKey(stopJob.getUser_id()); if(user==null) return ; p.addUser(user); // if (user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)) { // List<CUserAtv> atvs = new ArrayList<CUserAtv>(); // atvs.add(cUserAtvDao.queryAtvById(user.getUser_id())); // p.setSelectedAtvs(atvs); // } else if (user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)) { // List<CUserDtv> dtvs = new ArrayList<CUserDtv>(); // dtvs.add(cUserDtvDao.queryDtvById(user.getUser_id())); // p.setSelectedDtvs(dtvs); // } else if (user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)) { // List<CUserBroadband> bands = new ArrayList<CUserBroadband>(); // bands.add(cUserBroadbandDao.queryBandById(user.getUser_id())); // p.setSelectedBands(bands); // } CustFullInfoDto custFullInfo = new CustFullInfoDto(); custFullInfo.setCust(cCustDao.findByKey(user.getCust_id())); p.setCustFullInfo(custFullInfo); p.setBusiCode(BusiCodeConstants.USER_REQUIRE_STOP); SOptr optr = gOptr(user.getArea_id(),user.getCounty_id()); p.setOptr(optr); userService.saveStop(p,DateHelper.formatNow(),0); LoggerUtil.PrintInfo(this.getClass(),"报停","用户【"+user.getUser_id()+"】报停成功"); } /** * 处理自动加授权 * @param prodList * @throws Exception */ public void saveAutoBusiCmd(List<CProdDto> prodList) throws Exception { List<JBusiCmd> busiCmdList = new ArrayList<JBusiCmd>(); for(CProdDto dto: prodList){ JBusiCmd busiCmdJob = new JBusiCmd(); busiCmdJob.setJob_id(getJobId()); busiCmdJob.setDone_code(-2); busiCmdJob.setBusi_cmd_type(BusiCmdConstants.ACCTIVATE_PROD); busiCmdJob.setCust_id(dto.getCust_id()); busiCmdJob.setUser_id(dto.getUser_id()); busiCmdJob.setStb_id(dto.getStb_id()); busiCmdJob.setCard_id(dto.getCard_id()); busiCmdJob.setModem_mac(dto.getModem_mac()); busiCmdJob.setProd_sn(dto.getProd_sn()); busiCmdJob.setArea_id(dto.getArea_id()); busiCmdJob.setCounty_id(dto.getCounty_id()); busiCmdJob.setPriority(SystemConstants.PRIORITY_SSSQ); //是产品指令 if (dto.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){ busiCmdJob.setProd_id(dto.getProd_id()); busiCmdList.add(busiCmdJob); } else { //在c_prod 表中去套餐子产品,因为要对子产品的动态资源发送授权,动态资源是根据子产品的prod_sn 取的。 List<CProdDto> cprodDtoList = cProdDao.queryChildProdByPkgsn(dto.getProd_sn(), dto.getCounty_id()); if(null!=cprodDtoList){ for (CProdDto pp: cprodDtoList){ busiCmdJob.setProd_id(pp.getProd_id()); busiCmdJob.setProd_sn(pp.getProd_sn()); busiCmdList.add(busiCmdJob); } } } } jBusiCmdDao.save(busiCmdList.toArray(new JBusiCmd[busiCmdList.size()])); } private int getJobId() throws Exception{ return Integer.parseInt(jBusiCmdDao.findSequence(SequenceConstants.SEQ_JOB_ID).toString()); } /** * 处理自动退订 * @param prodSns * @param dto * @throws Exception */ public void saveProdStop(CProdDto prod) throws Exception { BusiParameter p = new BusiParameter(); CUser user = cUserDao.findByKey(prod.getUser_id()); // if (user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)) { // List<CUserAtv> atvs = new ArrayList<CUserAtv>(); // atvs.add(cUserAtvDao.queryAtvById(user.getUser_id())); // p.setSelectedAtvs(atvs); // } else if (user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)) { // List<CUserDtv> dtvs = new ArrayList<CUserDtv>(); // dtvs.add(cUserDtvDao.queryDtvById(user.getUser_id())); // p.setSelectedDtvs(dtvs); // } else if (user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)) { // List<CUserBroadband> bands = new ArrayList<CUserBroadband>(); // bands.add(cUserBroadbandDao.queryBandById(user.getUser_id())); // p.setSelectedBands(bands); // } p.addUser(user); CustFullInfoDto custFullInfo = new CustFullInfoDto(); custFullInfo.setCust(cCustDao.findByKey(user.getCust_id())); p.setCustFullInfo(custFullInfo); p.setBusiCode(BusiCodeConstants.JOB_PROD_STOP); SOptr optr = gOptr(prod.getArea_id(),prod.getCounty_id()); //判断是否有欠费,如果有欠费修改账单的实际出帐金额 if (prod.getAll_balance()-prod.getOwe_fee()-prod.getReal_bill()<0){ if (prod.getOwe_fee()==0){ //有往月欠费 //更新本月账单为all_balance this.busiDao.updateNotConfirmBill(prod.getProd_sn(), prod.getAll_balance(),prod.getCounty_id()); } else { //删除当月账单 this.busiDao.delNotConfirmBill(prod.getProd_sn(),prod.getCounty_id()); //更新历史账单欠费为0 this.busiDao.updateConfirmedBill(prod.getProd_sn(),prod.getCounty_id()); } } //终止产品 p.setOptr(optr); String[] prodSn = new String[1]; prodSn[0] = prod.getProd_sn(); userProdService.saveTerminate(p,prodSn, "JOB_PROD_STOP", null, null); LoggerUtil.PrintInfo(this.getClass(),"自动退订","客户【"+user.getCust_id()+"】下的产品编号【"+prod.getProd_id()+"】退订成功"); } /** * 将套餐子产品从套餐中移走 * @param prod * @throws Exception */ public void saveEditPkg(CProdDto prod) throws Exception{ SOptr optr = gOptr(prod.getArea_id(),prod.getCounty_id()); BusiParameter p = new BusiParameter(); p.setOptr(optr); CustFullInfoDto custFullInfo = new CustFullInfoDto(); custFullInfo.setCust(cCustDao.findByKey(prod.getCust_id())); p.setCustFullInfo(custFullInfo); p.setBusiCode(BusiCodeConstants.PKG_EDIT); userProdService.saveEditCustPkg(p, prod.getProd_sn()); LoggerUtil.PrintInfo(this.getClass(),"修改客户套餐","客户【"+prod.getCust_id()+"】下的产品编号【"+prod.getProd_id()+"】从套餐编号"+"prod.getPackage_sn()"+"移走"); } /** * 账目余额解冻 * @param unfreezeJob * @throws Exception */ public void acctUnfreeze(CAcctAcctitemInactive unfreezeJob)throws Exception{ SOptr optr = gOptr(unfreezeJob.getArea_id(),unfreezeJob.getCounty_id()); BusiParameter p = new BusiParameter(); p.setOptr(optr); int fee = acctService.saveAcctUnfreeze(p,unfreezeJob); LoggerUtil.PrintInfo(this.getClass(),"资金解冻","账目【"+unfreezeJob.getAcct_id()+"|"+unfreezeJob.getAcctitem_id()+"】解冻了"+fee+"分"); } /** * 银行签约 * @throws Exception */ public boolean saveSignBank(CBankAgree bank) throws Exception { CCust cust = cCustDao.queryCustByCustNo(bank.getB_asnb()); if (null == cust) { throw new ComponentException("错误的客户编号:" + bank.getB_asnb()); } CustFullInfoDto cfd = new CustFullInfoDto(); cfd.setCust(cust); SOptr optr = gOptr(cust.getArea_id(), cust.getCounty_id()); BusiParameter p = new BusiParameter(); p.setOptr(optr); p.setCustFullInfo(cfd); p.setBusiCode(BusiCodeConstants.ACCT_BANK_AGREE); try { acctService.saveSignBank(p, bank); } catch (Exception e) { throw new ComponentException("签约失败,客户编号:" + cust.getCust_no() + e.getMessage()); } return true; } /** * 取消银行签约 * @throws Exception */ public boolean saveRemoveSignBank(CBankAgree bank) throws Exception { CCust cust = cCustDao.queryCustByCustNo(bank.getB_asnb()); if (null == cust) { throw new ComponentException("错误的客户编号:" + bank.getB_asnb()); } CustFullInfoDto cfd = new CustFullInfoDto(); cfd.setCust(cust); SOptr optr = gOptr(cust.getArea_id(), cust.getCounty_id()); BusiParameter p = new BusiParameter(); p.setOptr(optr); p.setCustFullInfo(cfd); p.setBusiCode(BusiCodeConstants.ACCT_BANK_CANCEL_AGREE); Date time = DateHelper.parseDate(bank.getB_wkdt(), DateHelper.FORMAT_YMD); try { acctService.saveRemoveSignBank(p, SystemConstants.PAY_TYPE_BANK_DEDU, time); } catch (Exception e) { throw new ComponentException("解约失败,客户编号:" + cust.getCust_no() + e.getMessage()); } return true; } /** * 保存银行扣费记录 * @throws Exception */ public void saveBankGotodisk(String fileNo)throws Exception{ busiDao.saveBankGotodisk(fileNo); } public void updateBankReturn(CBankReturn cbr2)throws Exception { cBankReturnDao.update(cbr2); } public void updateBankReturnPayerror(CBankReturnPayerror dest)throws Exception { cBankReturnPayerrorDao.update(dest); } public void saveBankReturnPayerror(CBankReturnPayerror dest)throws Exception { cBankReturnPayerrorDao.save(dest); } /** * 保存银行回盘记录 * @return * @throws Exception */ public void saveBankReturn(List<CBankReturn> list)throws Exception{ busiDao.saveBankReturn(list); } public void queryBankReturn(DataHandler<CBankReturn> handler)throws Exception{ cBankReturnDao.queryBankList(handler); } /** * 保存银行缴费 * @return * @throws Exception */ public boolean saveBankPk(CBankReturn bank, CBankGotodisk cbg)throws Exception{ SOptr optr = gOptr(cbg.getArea_id(), cbg.getCounty_id()); BusiParameter p = new BusiParameter(); CustFullInfoDto custFullInfo = new CustFullInfoDto(); CCust cust = cCustDao.findByKey(cbg.getCust_id()); custFullInfo.setCust(cust); p.setCustFullInfo(custFullInfo); p.setOptr(optr); p.setBusiCode(BusiCodeConstants.ACCT_BANK_PAY); try{ int doneCode = acctService.saveBankPk(p, bank.getBank_trans_sn(), cbg.getAcct_id(),cbg.getCust_id(), cbg.getAcctitem_id(), cbg.getStart_date(), cbg.getEnd_date(), cbg.getFee(), cbg.getUser_id(),cbg.getProd_sn()); bank.setPay_done_code(doneCode); LoggerUtil.PrintInfo(this.getClass(), "银行缴费", "交易流水【" + bank.getBank_trans_sn() + "|客户号" + cbg.getCust_id() + "】金额: " + cbg.getFee()); return true; }catch(Exception e){ e.printStackTrace(); bank.setPay_failure_reason(e.getMessage()); } return false; } public CBankGotodisk findBankGotodisk(String trans_sn)throws Exception{ return cBankGotodiskDao.findByKey(trans_sn); } public CBankRefundtodisk findBankRefundtodisk(String trans_sn)throws Exception{ return cBankRefundtodiskDao.findByKey(trans_sn); } /** * 查询银行扣费记录 * @throws Exception */ public void queryBankGotodisk(String fileNo, DataHandler<CBankGotodisk> handler)throws Exception{ busiDao.queryBankGotoDisk(fileNo, handler); } /** * 保存银行退款记录 * @throws Exception */ public void saveBankRefundtodisk(String fileNo)throws Exception{ busiDao.saveBankRefundtodisk(fileNo); } public void updateBankReturnPayError(CBankReturnPayerror error)throws Exception{ this.cBankReturnPayerrorDao.save(error); } /** * 查询银行退款记录 * @throws Exception */ public void queryBankRefundtoDisk(String fileNo, DataHandler<CBankGotodisk> handler)throws Exception{ busiDao.queryBankRefundtoDisk(fileNo, handler); } /** * 取消预扣费 * @param acctPreFee * @throws Exception */ public void cancelAcctPreFee(CAcctPreFee acctPreFee) throws Exception{ SOptr optr = gOptr(acctPreFee.getArea_id(), acctPreFee.getCounty_id()); BusiParameter p = new BusiParameter(); CustFullInfoDto custFullInfo = new CustFullInfoDto(); CCust cust = cCustDao.findByKey(acctPreFee.getCust_id()); custFullInfo.setCust(cust); p.setCustFullInfo(custFullInfo); p.setOptr(optr); acctService.cancelVodPreFee(p,acctPreFee); LoggerUtil.PrintInfo(this.getClass(),"取消预扣费","交易流水【"+acctPreFee.getTrans_id()+"|用户编号"+acctPreFee.getUser_id()+"】取消了"+acctPreFee.getFee()+"分"); } /** * 设置用户产品之间的包含关系 * @param custId * @param userId * @param countyId * @param cfgData * @throws Exception */ public int setProdInclude(Integer doneCode,String custId,String userId,String countyId,String areaId) throws Exception{ LoggerHelper.debug(getClass(), "开始处理【产品包含】,客户ID:"+custId+",用户ID:"+userId+",地区ID:"+countyId); //查找用户产品 List<CProd> prodList = busiDao.queryUserProd(userId, countyId); //获取产品的res信息 List<ProdRes> prodResList = new ArrayList<ProdRes>(); for (CProd prod:prodList){ ProdRes pr = new ProdRes(); pr.setProdSn(prod.getProd_sn()); if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){ //查询基本产品所有资源 List<String> resList= jBusiCmdDao.queryBaseProdRes(pr.getProdSn()); pr.getResList().addAll(resList); prodResList.add(pr); } else { List<String> dynRes= jBusiCmdDao.queryDnyRes(pr.getProdSn()); pr.getResList().addAll(dynRes); //查找套餐对应的子产品 List<CProd> childProdList = cProdDao.queryByPkgSn(pr.getProdSn(), countyId); for (CProd cp:childProdList){ //查询基本产品所有资源 List<String> resList= jBusiCmdDao.queryBaseProdRes(cp.getProd_sn()); pr.getResList().addAll(resList); } prodResList.add(pr); } String resArr= null; for(String res : pr.getResList()){ resArr = StringHelper.append(resArr,res,","); } LoggerHelper.debug(getClass(), "产品prod_sn:"+prod.getProd_sn()+",资源:"+resArr); } //比较资源之间的包含关系 List<CProdInclude> includeList =new ArrayList<CProdInclude>(); for (int i=0;i<prodResList.size()-1;i++){ ProdRes pr = prodResList.get(i); for (int j=i+1;j<prodResList.size();j++){ ProdRes pr1 = prodResList.get(j); if (pr1.getResList() == null || pr1.getResList().size()==0) continue; int k = CollectionHelper.compare(pr.getResList(), pr1.getResList()); if (k !=0){ CProdInclude include = new CProdInclude(); include.setCust_id(custId); include.setUser_id(userId); if (k==1){ include.setProd_sn(pr.getProdSn()); include.setInclude_prod_sn(pr1.getProdSn()); } else { include.setProd_sn(pr1.getProdSn()); include.setInclude_prod_sn(pr.getProdSn()); } LoggerHelper.debug(getClass(), "一条包含数据,prod_sn:"+include.getProd_sn()+",被包含prod_sn:"+include.getInclude_prod_sn()); includeList.add(include); } } } //保存比较结果 busiDao.saveProdInclude(userId, includeList); //插入信控 if(includeList.size() > 0){ JCustCreditCal creditCal = new JCustCreditCal(); creditCal.setJob_id(getJobId()); creditCal.setDone_code(doneCode); creditCal.setCust_id(custId); creditCal.setCounty_id(countyId); creditCal.setArea_id(areaId); creditCal.setCredit_exec(SystemConstants.BOOLEAN_TRUE); jCustCreditCalDao.save(creditCal); } LoggerHelper.debug(getClass(), "【产品包含】处理结束,用户ID:"+userId+",共:"+includeList.size()+"条数据"); return includeList.size(); } public void saveProdIncludeRecord(Integer doneCode, String custId, String userId, String countyId, String isSuccess,String errorInfo) throws JDBCException { busiDao.saveProdIncludeRecord(doneCode,custId,userId,countyId,isSuccess,errorInfo); } /** * 重新设置用户产品资源 * @param custId * @param unfreezeJob * @throws Exception */ public void resetUserProdRes(String custId)throws Exception{ CCust cust = cCustDao.findByKey(custId); List<CCust> unitList = cCustDao.queryUnitByResident(cust.getCust_id(), cust.getCounty_id()); if (unitList != null && unitList.size()>0) cust.setUnit_id(unitList.get(0).getCust_id()); SOptr optr = gOptr(cust.getArea_id(),cust.getCounty_id()); BusiParameter p = new BusiParameter(); CustFullInfoDto custFullInfo = new CustFullInfoDto(); custFullInfo.setCust(cust); p.setCustFullInfo(custFullInfo); p.setOptr(optr); userProdService.resetUserProdRes(p); LoggerUtil.PrintInfo(this.getClass(),"重置产品资源","设置客户【"+cust.getCust_name()+"】的产品资源"); } public void promotion(String userId) throws Exception{ //查找用户基本信息 CUser user = busiDao.queryUser(userId); if (user == null) throw new ComponentException("用户不存在userId="+userId); CCust cust = busiDao.queryCust(user.getCust_id()); if (cust == null) throw new ComponentException("客户不存在custId="+user.getCust_id()); // CUserAtv userAtv = new CUserAtv(); // CUserDtv userDtv = new CUserDtv(); // CUserBroadband userBroadband = new CUserBroadband(); // if (user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)) // userAtv = cUserAtvDao.queryAtvById(user.getUser_id()); // else if (user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)) // userDtv = cUserDtvDao.queryDtvById(user.getUser_id()); // else if (user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)) // userBroadband = cUserBroadbandDao.queryBandById(user.getUser_id()); //获取用户当日累积缴费 List<CFee> feeList = cFeeDao.queryUserFee(user.getCust_id(),userId); List<AcctitemDto> balanceList = cAcctAcctitemDao.queryAcctAndAcctItemByUserId(cust.getCust_id(),userId,cust.getCounty_id()); //获取用户当日参加过的促销主题 List<String> userPromotionList = busiDao.queryUserPromotionTheme(userId); //遍历自动促销,判断用户可以参加哪些促销 List<CProdDto> prodList = cProdDao.queryUserProd(userId, user.getCounty_id()); expressionUtil.setAllValue(cust, user, null,null,null, feeList, balanceList,prodList); expressionUtil.setCuserStb(cUserDao.queryUserStbByUserId(userId)); SOptr optr = gOptr(user.getArea_id(),user.getCounty_id()); for (PPromotionDto promotion:BusiCfgDataJob.CFG.getPromotionList()){ if (promotion.getAuto_exec().equals(SystemConstants.BOOLEAN_TRUE) && promotion.getCounty_id().equals(user.getCounty_id())){ //判断是否参加过同主题的促销 boolean flag=false; for (String themeId:userPromotionList){ if (promotion.getTheme_id().equals(themeId)){ flag=true; break; } } if (flag) continue; //计算可以参加促销的次数 int repetitionTimes = expressionUtil.parsePromotion(BusiCfgDataJob.CFG.getRuleStr(promotion.getRule_id()), promotion.getRepetition_times()); if (repetitionTimes>0){ BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.PROMOTION_AUTO); // if (user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)) { // List<CUserAtv> atvs = new ArrayList<CUserAtv>(); // atvs.add(userAtv); // p.setSelectedAtvs(atvs); // } else if (user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)) { // List<CUserDtv> dtvs = new ArrayList<CUserDtv>(); // dtvs.add(userDtv); // p.setSelectedDtvs(dtvs); // } else if (user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)) { // List<CUserBroadband> bands = new ArrayList<CUserBroadband>(); // bands.add(userBroadband); // p.setSelectedBands(bands); // } p.addUser(user); CustFullInfoDto custFullInfo = new CustFullInfoDto(); custFullInfo.setCust(cust); p.setCustFullInfo(custFullInfo); p.setOptr(optr); userService.savePromotion(p,repetitionTimes,promotion.getPromotion_id(), null, promotion.getAcctList()); LoggerUtil.PrintInfo(this.getClass(),"自动促销","用户"+user.getUser_id()+ "参加了【"+promotion.getPromotion_id()+promotion.getPromotion_name()+"】促销"); userPromotionList.add(promotion.getTheme_id()); } } } } public void cancelPromotion(String custId) throws Exception{ // 查找客户参加过的促销 List<CPromotion> promotionList = busiDao.queryCustPromotion(custId); CCust cust = busiDao.queryCust(custId); if (cust==null) return ; SOptr optr = gOptr(cust.getArea_id(),cust.getCounty_id()); for (CPromotion cp :promotionList){ CUser user = busiDao.queryUser(cp.getUser_id()); if (user == null) continue; // CUserAtv userAtv = new CUserAtv(); // CUserDtv userDtv = new CUserDtv(); // CUserBroadband userBroadband = new CUserBroadband(); // if (user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)) // userAtv = cUserAtvDao.queryAtvById(user.getUser_id()); // else if (user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)) // userDtv = cUserDtvDao.queryDtvById(user.getUser_id()); // else if (user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)) // userBroadband = cUserBroadbandDao.queryBandById(user.getUser_id()); //获取用户当日累积缴费 List<CFee> feeList = cFeeDao.queryUserFee(cp.getCust_id(),cp.getUser_id()); List<AcctitemDto> balanceList = cAcctAcctitemDao.queryAcctAndAcctItemByUserId(custId,cp.getUser_id(),cust.getCounty_id()); //设备公式的参数 List<CProdDto> prodList = cProdDao.queryUserProd(user.getUser_id(), user.getCounty_id()); expressionUtil.setAllValue(cust, user,null,null,null, feeList, balanceList,prodList); for (PPromotionDto promotion:BusiCfgDataJob.CFG.getPromotionList()){ if (promotion.getPromotion_id().equals(cp.getPromotion_id())){ int repetitionTimes = expressionUtil.parsePromotion(BusiCfgDataJob.CFG.getRuleStr(promotion.getRule_id()), promotion.getRepetition_times()); if (repetitionTimes<1){ //取消促销 BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.PROMOTION_CANCEL); CustFullInfoDto custFullInfo = new CustFullInfoDto(); custFullInfo.setCust(cust); p.setCustFullInfo(custFullInfo); p.setOptr(optr); userService.saveCancelPromotion(p,cp.getPromotion_sn()); LoggerUtil.PrintInfo(this.getClass(),"促销回退","用户"+user.getUser_id()+ "回退了【"+promotion.getPromotion_id()+promotion.getPromotion_name()+"】促销"); } break; } } } } public List<SCounty> queryAllCounty() throws Exception { return sCountyDao.findAll(); } public List<CUser> queryOwnFeeUser(String countyId) throws Exception { return cUserDao.queryOwnFeeUser(countyId,queryTemplateConfig(TemplateConfigDto.Config.OWN_LONG_DAYS.toString(), countyId)); } public void modifyUserStatus(List<CUser> userList) throws Exception { CUser cuser = userList.get(0); SOptr optr = gOptr(cuser.getArea_id(),cuser.getCounty_id()); BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.OWN_LONG); p.setOptr(optr); List<CUserPropChange> propChangeList = null; CUserPropChange cpc = null; for(CUser user : userList){ String userId = user.getUser_id(); propChangeList = new ArrayList<CUserPropChange>(); cpc = new CUserPropChange(); cpc.setUser_id(userId); cpc.setArea_id(user.getArea_id()); cpc.setCounty_id(user.getCounty_id()); cpc.setOld_value(user.getStatus()); cpc.setColumn_name("status"); cpc.setNew_value(StatusConstants.OWELONG); propChangeList.add(cpc); cpc = new CUserPropChange(); cpc.setUser_id(userId); cpc.setArea_id(user.getArea_id()); cpc.setCounty_id(user.getCounty_id()); cpc.setOld_value(DateHelper.dateToStr(user.getStatus_date())); cpc.setColumn_name("status_date"); cpc.setNew_value(DateHelper.dateToStr(new Date())); propChangeList.add(cpc); // String userType = user.getUser_type(); // if(userType.equals(SystemConstants.USER_TYPE_ATV)){ // List<CUserAtv> selectedAtvs = new ArrayList<CUserAtv>(); // CUserAtv userAtv = new CUserAtv(); // userAtv.setUser_id(userId); // selectedAtvs.add(userAtv); // p.setSelectedAtvs(selectedAtvs); // }else if(userType.equals(SystemConstants.USER_TYPE_DTV)){ // List<CUserDtv> selectedDtvs = new ArrayList<CUserDtv>(); // CUserDtv userDtv = new CUserDtv(); // userDtv.setUser_id(userId); // selectedDtvs.add(userDtv); // p.setSelectedDtvs(selectedDtvs); // } p.addUser(user); CustFullInfoDto dto = new CustFullInfoDto(); CCust cust = new CCust(); cust.setCust_id(user.getCust_id()); dto.setCust(cust); p.setCustFullInfo(dto); userService.editUserStatus(p, propChangeList); } } /** * 计算客户到期日 * @param custId * @param countyId */ public void calprodInvalidDate(String custId, String countyId) { // TODO Auto-generated method stub } public void delAcctItem(int jobId,String acctId, String acctItemId,Integer doneCode) throws Exception{ CAcct acct = this.busiDao.queryAcct(acctId); if (acct==null) return; SOptr optr = gOptr(acct.getArea_id(),acct.getCounty_id()); BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.PROD_TERMINATE); p.setOptr(optr); acctService.saveDelAcctItem(p,acctId, acctItemId,doneCode); } public boolean canRemove(int jobId,String acctId, String acctItemId) throws Exception{ if ( jobDao.qureyJobCount(jobId) ==0) return true; else return false; } public boolean canCancelPromotion(String custId) throws Exception{ if ( jobDao.qureyJobCount(custId) ==0) return true; else return false; } /** * 补入非公用账目充值的账目异动数据 * @param doneCode * @throws Exception */ public void adjustSpecAcctPay(Integer doneCode) throws Exception { List<CAcctAcctitemChange> changeList = cAcctAcctitemChangeDao.querybyDoneCode(doneCode); if(null != changeList && changeList.size() > 0){ SOptr optr = gOptr(changeList.get(0).getArea_id(),changeList.get(0).getCounty_id()); BusiParameter p = new BusiParameter(); p.setOptr(optr); acctService.saveAdjustSpecAcctPay(p,changeList,doneCode); LoggerUtil.PrintInfo(this.getClass(),"补入非公用账目充值的账目异动数据","客户"+changeList.get(0).getCust_id()+ "流水"+doneCode+"共"+changeList.size()+"条缴费异动"); } } /** * 添加解冻对应 赠送 缴费冲正记录 * 修改活动余额 * 修改账目信息 * @param changeAcctitem 账目解冻异动 * @param doneCode * @throws Exception */ public void dealReversalChange(CAcctAcctitemChange changeAcctitem,Integer doneCode) throws Exception { //当前解冻为止,赠送金额之和 int presentBalance = jobDao.queryPresentBalance(changeAcctitem .getAcct_id(), changeAcctitem.getAcctitem_id(), DateHelper .format(changeAcctitem.getDone_date())); CAcctAcctitemChange change = new CAcctAcctitemChange(); int changeFee = changeAcctitem.getChange_fee(); //变更金额 BeanUtils.copyProperties(changeAcctitem, change); change.setDone_code(doneCode); change.setBusi_code(BusiCodeConstants.ACCT_PAY); //缴费 change.setChange_type(SystemConstants.ACCT_CHANGE_UNCFEE); //缴费冲正 change.setChange_fee(changeFee*-1); change.setPre_fee(presentBalance); //上次余额 change.setFee(presentBalance - changeFee); //当前余额为上次余额减去变更金额 cAcctAcctitemChangeDao.save(change); String acctId = changeAcctitem.getAcct_id(); String acctItemId = changeAcctitem.getAcctitem_id(); String feeType = SystemConstants.ACCT_FEETYPE_PRESENT; //赠送 String countyId = changeAcctitem.getCounty_id(); CAcctAcctitemActive activeItem = jobDao.queryActiveAcctitem(acctId, acctItemId, feeType, countyId); //是否有赠送活动余额 if(activeItem != null){ int balance = activeItem.getBalance(); if(balance >= changeFee){ //活动余额大于解冻金额 jobDao.updateActiveAcctitemBalance(changeFee*-1, acctId, acctItemId, feeType, countyId); } } cAcctAcctitemDao.updateActiveBanlance(acctId, acctItemId, changeFee*-1, changeFee, 0, 0, countyId); // LoggerUtil.PrintMessage("冲正后解冻金额未冲掉","账目【"+acctId+"|"+acctItemId+"】异动金额"+changeFee*-1+"分"); } private SOptr gOptr(String areaId,String countyId) { SOptr optr = new SOptr(); optr.setCounty_id(StringUtils.isEmpty(countyId) ? "4501" : countyId); optr.setArea_id(StringUtils.isEmpty(areaId) ? "4501" : areaId); optr.setOptr_id("0"); optr.setDept_id(StringUtils.isEmpty(countyId) ? "4501" : countyId); return optr; } public List<CUser> queryProdIncludeUser(String countyId) throws JDBCException { return jobDao.queryProdIncludeUser(countyId); } public boolean isExistsUnBillByProdSn(String prodSn) throws Exception { return busiDao.isExistsUnBillByProdSn(prodSn); } public void updateProdStatus(Integer doneCode, String prodSn) throws Exception { CProd prod = cProdDao.findByKey(prodSn); //停机不改为暂停状态 if(prod != null && StringHelper.isNotEmpty(prod.getUser_id())){ SOptr optr = gOptr(prod.getArea_id(),prod.getCounty_id()); BusiParameter p = new BusiParameter(); p.setBusiCode(BusiCodeConstants.TEMP_PROD_PAUSE); p.setOptr(optr); CustFullInfoDto custFullDto = new CustFullInfoDto(); CCust cust = new CCust(); cust.setCust_id(prod.getCust_id()); custFullDto.setCust(cust); p.setCustFullInfo(custFullDto); userProdService.pauseProd(p, doneCode, prod.getProd_sn(), prod.getUser_id()); } } public void execPause(Integer doneCode, Integer jobId, String prodSn, String oldTariffId, String newTariffId){ try { if(StringHelper.isNotEmpty(oldTariffId)){ PProdTariff oldTariff = this.queryTariffById(oldTariffId); PProdTariff newTariff = this.queryTariffById(newTariffId); //包月资费不暂停 if(oldTariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH) && newTariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH) && oldTariff.getBilling_cycle().intValue() == 1){ //老资费是包年 , 新资费是包月 或 包年 。 }else{ //无销账的账单,产品暂停 boolean flag = this.isExistsUnBillByProdSn(prodSn); if(flag){ this.updateProdStatus(doneCode, prodSn); LoggerUtil.PrintInfo(this.getClass(),"修改产品状态为暂停","产品【"+prodSn+"】"); } } } } catch (Exception e) { e.printStackTrace(); LoggerUtil.PrintInfo(this.getClass(),"修改产品状态暂停","产品【"+prodSn+"】, 异常: "+e.getMessage()); } } public PProdTariff queryTariffById(String tariffId) throws Exception { return pProdTariffDao.findByKey(tariffId); } public List<JSmsRecord> queryReminderCustRecord(String countyId) throws Exception { return jSmsRecordDao.queryReminderCustRecord(countyId); } public void queryInvalidProd(Date invalidDate, DataHandler<CProdDto> dataHandler) throws Exception { busiDao.queryInvalidProd(invalidDate, dataHandler); } public List<CProdDto> queryInvalidProd(Date invalidDate) throws Exception { return busiDao.queryInvalidProd(invalidDate); } public void updateStopProd() { try { List<CProd> prodList = busiDao.queryStopProd(); LoggerUtil.PrintInfo(this.getClass(),"巡查停机产品","修改记录数:"+prodList.size()); for(CProd prod : prodList){ busiDao.updateStopProd(prod); LoggerUtil.PrintInfo(this.getClass(),"巡查停机产品","产品【"+prod.getProd_sn()+"】"); } } catch (Exception e) { e.printStackTrace(); LoggerUtil.PrintInfo(this.getClass(),"巡查停机产品","异常:"+e.getMessage()); } } public void dealInvalidProd(CProdDto prod) throws Exception { String prodSn = prod.getProd_sn(); LoggerUtil.PrintInfo(this.getClass(), "按到期日停机", "产品【"+prod.getProd_sn()+"】"); if( (prod.getAll_balance() - prod.getOwe_fee() - prod.getReal_bill() >= prod.getTariff_rent()/2) || prod.getInactive_balance() > 0 ){ //实时余额 大于等于 产品半个月资费 或 有冻结金额,不删除余额,记录数据 busiDao.saveNoDelProd(prod); busiDao.updateStopProd(prod); LoggerUtil.PrintInfo(this.getClass(), "按到期日停机", "产品【"+prod.getProd_sn()+"】实时余额 大于等于 产品半个月资费 或 有冻结金额,不删除余额,记录数据"); }else{ int oweFee = prod.getOwe_fee(); if(oweFee > 0){ LoggerUtil.PrintInfo(this.getClass(), "按到期日停机", "产品【"+prod.getProd_sn()+"】有欠费"); //有欠费账单,插入一条负的总欠费调账账单 int sumOweFee = busiDao.sumOweBill(prodSn, prod.getCounty_id()) * -1; busiDao.cancelOweBill(prodSn, sumOweFee); cAcctAcctitemDao.changeOwefee(true, prod.getAcct_id(), prod.getProd_id(), sumOweFee, prod.getCounty_id()); busiDao.cancelRealBill(prodSn); }else{ int balance = prod.getAll_balance(); if(balance > 0){ LoggerUtil.PrintInfo(this.getClass(), "按到期日停机", "产品【"+prod.getProd_sn()+"】有余额"); busiDao.cancelRealBill(prodSn, balance); cAcctAcctitemDao.changeOwefee(true, prod.getAcct_id(), prod.getProd_id(), balance, prod.getCounty_id()); } } //删除日租 busiDao.delRentFee(prodSn); //当天到期 if(DateHelper.dateToStr(prod.getInvalid_date()).equals(DateHelper.dateToStr(DateHelper.now()))){ //包月基本包变更 状态为欠费停机(是否欠费停由后台账务控制,标记为欠费未停,为了变更账务模式程序不会重复判断) //变更为按账务模式计费 busiDao.saveProdProp(prodSn, SystemConstants.BOOLEAN_FALSE, StatusConstants.OWENOTSTOP); } } // jobDao.createCustWriteOffJob(prod.getCust_id(), SystemConstants.BOOLEAN_TRUE, prod.getArea_id(), prod.getCounty_id()); this.createCustWriteOffJob(-3, prod.getCust_id(), SystemConstants.BOOLEAN_TRUE, prod.getArea_id(), prod.getCounty_id()); //记录每天操作记录 jobDao.saveInvalidCal(prod.getProd_sn(), prod.getArea_id(), prod.getCounty_id()); } public void createCustWriteOffJob(Integer doneCode,String custId,String writeOff, String areaId, String countyId)throws Exception{ JCustWriteoff writeOffJob = new JCustWriteoff(); writeOffJob.setJob_id(getJobId()); writeOffJob.setDone_code(doneCode); writeOffJob.setCust_id(custId); writeOffJob.setArea_id(areaId); writeOffJob.setCounty_id(countyId); writeOffJob.setWriteoff(writeOff); jCustWriteoffDao.save(writeOffJob); } public void deleteInvaliCal() throws Exception { jobDao.deleteInvalidCal(); } public void setBusiDao(BusiDao busiDao) { this.busiDao = busiDao; } /** * @param custDao the cCustDao to set */ public void setCCustDao(CCustDao custDao) { cCustDao = custDao; } /** * @param busiCmdDao the jBusiCmdDao to set */ public void setJBusiCmdDao(JBusiCmdDao busiCmdDao) { jBusiCmdDao = busiCmdDao; } /** * @param userDao the cUserDao to set */ public void setCUserDao(CUserDao userDao) { cUserDao = userDao; } /** * @param userAtvDao the cUserAtvDao to set */ public void setCUserAtvDao(CUserAtvDao userAtvDao) { cUserAtvDao = userAtvDao; } /** * @param userDtvDao the cUserDtvDao to set */ public void setCUserDtvDao(CUserDtvDao userDtvDao) { cUserDtvDao = userDtvDao; } /** * @param userBroadbandDao the cUserBroadbandDao to set */ public void setCUserBroadbandDao(CUserBroadbandDao userBroadbandDao) { cUserBroadbandDao = userBroadbandDao; } /** * @param feeDao the cFeeDao to set */ public void setCFeeDao(CFeeDao feeDao) { cFeeDao = feeDao; } public void setJobDao(JobDao jobDao) { this.jobDao = jobDao; } public void setCProdDao(CProdDao prodDao) { cProdDao = prodDao; } public void setExpressionUtil(ExpressionUtil expressionUtil) { this.expressionUtil = expressionUtil; } /** * @param acctAcctitemDao the cAcctAcctitemDao to set */ public void setCAcctAcctitemDao(CAcctAcctitemDao acctAcctitemDao) { cAcctAcctitemDao = acctAcctitemDao; } public void setCAcctAcctitemChangeDao( CAcctAcctitemChangeDao acctAcctitemChangeDao) { this.cAcctAcctitemChangeDao = acctAcctitemChangeDao; } public void setCProdInvalidUpdateDao(CProdInvalidUpdateDao prodInvalidUpdateDao) { cProdInvalidUpdateDao = prodInvalidUpdateDao; } /** * @param userService the userService to set */ public void setUserService(IUserServiceExternal userService) { this.userService = userService; } /** * @param custService the custService to set */ public void setCustService(ICustServiceExternal custService) { this.custService = custService; } /** * @param acctService the acctService to set */ public void setAcctService(IAcctServiceExternal acctService) { this.acctService = acctService; } /** * @param userProdService the userProdService to set */ public void setUserProdService(IUserProdServiceExternal userProdService) { this.userProdService = userProdService; } public void setSCountyDao(SCountyDao countyDao) { sCountyDao = countyDao; } public void setPProdTariffDao(PProdTariffDao prodTariffDao) { pProdTariffDao = prodTariffDao; } public void setJCustCreditCalDao(JCustCreditCalDao custCreditCalDao) { jCustCreditCalDao = custCreditCalDao; } /** * @param smsRecordDao the jSmsRecordDao to set */ public void setJSmsRecordDao(JSmsRecordDao smsRecordDao) { jSmsRecordDao = smsRecordDao; } public void saveJSmsRecord(List<JSmsRecord> recordList) throws JDBCException { jSmsRecordDao.save(recordList.toArray(new JSmsRecord[recordList.size()])); } /** * 查询所有催缴内容 * @return * @throws Exception */ public Map<String, BTaskInfo> queryPromptInfo() throws Exception { return bTaskInfoDao.queryTaskInfo(); } /** * @return the bTaskInfoDao */ public BTaskInfoDao getBTaskInfoDao() { return bTaskInfoDao; } /** * @param taskInfoDao the bTaskInfoDao to set */ public void setBTaskInfoDao(BTaskInfoDao taskInfoDao) { bTaskInfoDao = taskInfoDao; } public void setCProdPropPatDao(CProdPropPatDao prodPropPatDao) { cProdPropPatDao = prodPropPatDao; } public void setCProdPropChangeDao(CProdPropChangeDao prodPropChangeDao) { cProdPropChangeDao = prodPropChangeDao; } public void setJCustInvalidCalDao(JCustInvalidCalDao custInvalidCalDao) { jCustInvalidCalDao = custInvalidCalDao; } public void setJCustWriteoffDao(JCustWriteoffDao custWriteoffDao) { jCustWriteoffDao = custWriteoffDao; } public void setCBankGotodiskDao(CBankGotodiskDao cBankGotodiskDao) { this.cBankGotodiskDao = cBankGotodiskDao; } public void setCBankReturnDao(CBankReturnDao cBankReturnDao) { this.cBankReturnDao = cBankReturnDao; } public void setCBankRefundtodiskDao(CBankRefundtodiskDao cBankRefundtodiskDao) { this.cBankRefundtodiskDao = cBankRefundtodiskDao; } public void setCBankReturnPayerrorDao( CBankReturnPayerrorDao cBankReturnPayerrorDao) { this.cBankReturnPayerrorDao = cBankReturnPayerrorDao; } public void savebankagree(List<CBankAgree> bankList) throws JDBCException { cBankAgreeDao.save(bankList.toArray(new CBankAgree[bankList.size()])); } public List<CBankAgree> quertyUnProcBankAgree() throws JDBCException { return cBankAgreeDao.queryUnProc(); } public void successBankAgree(Integer agree_id) throws JDBCException { cBankAgreeDao.updateProcStatus(agree_id,SystemConstants.BOOLEAN_TRUE,""); } public void failBankAgree(Integer agree_id, String message) throws JDBCException { cBankAgreeDao.updateProcStatus(agree_id,SystemConstants.BOOLEAN_FALSE,message); } /** * @param bankAgreeDao the cBankAgreeDao to set */ public void setCBankAgreeDao(CBankAgreeDao bankAgreeDao) { cBankAgreeDao = bankAgreeDao; } public void runBankReturn() throws Exception { SOptr optr = gOptr("5000", "5001"); BusiParameter p = new BusiParameter(); p.setOptr(optr); p.setBusiCode(BusiCodeConstants.ACCT_BANK_PAY); cBankReturnDao.updateFailure(); List<BankReturnDto> unExecBankRetrunList = cBankReturnDao.queryUnExecBankRetrun(); int threadnum=5; Integer num = unExecBankRetrunList.size()/threadnum; System.out.println("处理总数"+unExecBankRetrunList.size()); System.out.println("num"+num); int s = 0; List<BankReturnDto> tList = new ArrayList<BankReturnDto>(); for(BankReturnDto d :unExecBankRetrunList){ tList.add(d); if (++s>num){ new Thread(new BankExec(acctService,tList,p,cCustDao)).start(); s=0; tList = new ArrayList<BankReturnDto>(); } } new Thread(new BankExec(acctService,tList,p,cCustDao)).start(); } } class BankExec extends Thread { private List<BankReturnDto> execList ; private IAcctServiceExternal acctService; private BusiParameter p; private CCustDao cCustDao; /** * @param acctService2 * @param list */ public BankExec(IAcctServiceExternal acctService, List<BankReturnDto> execList,BusiParameter p,CCustDao cCustDao) { this.acctService = acctService; this.execList = execList; this.p = p; this.cCustDao = cCustDao; } public void run() { System.out.println("处理数量:"+execList.size()); for (BankReturnDto r:execList) { try { CustFullInfoDto custFullInfo = new CustFullInfoDto(); custFullInfo.setCust(cCustDao.findByKey(r.getCust_id())); p.setCustFullInfo(custFullInfo); acctService.runBankReturn(p,r); } catch (Exception e) { e.printStackTrace(); } } } }