/**
*
*/
package com.ycsoft.business.service.impl;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.ycsoft.beans.config.TBusiFee;
import com.ycsoft.beans.config.TCountyAcct;
import com.ycsoft.beans.config.TRuleDefine;
import com.ycsoft.beans.core.acct.CAcct;
import com.ycsoft.beans.core.acct.CAcctAcctitem;
import com.ycsoft.beans.core.acct.CAcctAcctitemAdjust;
import com.ycsoft.beans.core.acct.CAcctAcctitemChange;
import com.ycsoft.beans.core.acct.CAcctAcctitemInactive;
import com.ycsoft.beans.core.acct.CAcctAcctitemOrder;
import com.ycsoft.beans.core.acct.CAcctAcctitemThreshold;
import com.ycsoft.beans.core.acct.CAcctAcctitemThresholdProp;
import com.ycsoft.beans.core.acct.CAcctBank;
import com.ycsoft.beans.core.acct.CAcctPreFee;
import com.ycsoft.beans.core.acct.CGeneralAcct;
import com.ycsoft.beans.core.acct.CGeneralContract;
import com.ycsoft.beans.core.acct.CGeneralContractDetail;
import com.ycsoft.beans.core.acct.CGeneralContractPay;
import com.ycsoft.beans.core.acct.CGeneralCredential;
import com.ycsoft.beans.core.bank.CBankAgree;
import com.ycsoft.beans.core.bank.CBankPay;
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.BBill;
import com.ycsoft.beans.core.bill.BBillWriteoff;
import com.ycsoft.beans.core.common.CDoneCode;
import com.ycsoft.beans.core.cust.CCust;
import com.ycsoft.beans.core.fee.CFee;
import com.ycsoft.beans.core.prod.CProd;
import com.ycsoft.beans.core.user.CUser;
import com.ycsoft.beans.invoice.RInvoice;
import com.ycsoft.beans.prod.PProdTariff;
import com.ycsoft.beans.prod.PPromFee;
import com.ycsoft.beans.system.SDept;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.business.commons.pojo.BusiParameter;
import com.ycsoft.business.component.config.ExpressionUtil;
import com.ycsoft.business.component.core.PrintComponent;
import com.ycsoft.business.dto.config.TemplateConfigDto;
import com.ycsoft.business.dto.core.acct.AcctAcctitemActiveDto;
import com.ycsoft.business.dto.core.acct.AcctAcctitemInvalidDto;
import com.ycsoft.business.dto.core.acct.AcctAcctitemThresholdDto;
import com.ycsoft.business.dto.core.acct.AcctDto;
import com.ycsoft.business.dto.core.acct.AcctitemDto;
import com.ycsoft.business.dto.core.acct.BankReturnDto;
import com.ycsoft.business.dto.core.acct.GeneralContractDto;
import com.ycsoft.business.dto.core.acct.PayDto;
import com.ycsoft.business.dto.core.acct.QueryAcctitemThresholdDto;
import com.ycsoft.business.dto.core.acct.UnitPayDto;
import com.ycsoft.business.dto.core.cust.CustFullInfoDto;
import com.ycsoft.business.dto.core.fee.CFeePayDto;
import com.ycsoft.business.dto.core.print.ConfirmPrintDto;
import com.ycsoft.business.dto.core.print.ConfirmPrintDto.ConfirmPrint;
import com.ycsoft.business.dto.core.prod.CProdDto;
import com.ycsoft.business.dto.core.prod.PromFeeProdDto;
import com.ycsoft.business.service.IAcctService;
import com.ycsoft.commons.constants.BusiCmdConstants;
import com.ycsoft.commons.constants.BusiCodeConstants;
import com.ycsoft.commons.constants.DictKey;
import com.ycsoft.commons.constants.StatusConstants;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.exception.ServicesException;
import com.ycsoft.commons.helper.CollectionHelper;
import com.ycsoft.commons.helper.DateHelper;
import com.ycsoft.commons.helper.JsonHelper;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.commons.store.MemoryDict;
import com.ycsoft.daos.core.JDBCException;
import com.ycsoft.daos.core.Pager;
/**
* @author liujiaqi
*/
@Service
public class AcctService extends BaseBusiService implements IAcctService {
private ExpressionUtil expressionUtil;
private PrintComponent printComponent;
public void savePrePay(BusiParameter p,List<PayDto> payList) throws Exception {
this.setParam(p);
savePrePay(payList);
}
public void savePrePay(List<PayDto> payList) throws Exception {
//获取业务流水
if(null != payList && payList.size() > 0){
Integer doneCode = doneCodeComponent.gDoneCode();
String busiInfo = "";
List<ConfirmPrint> confirmPrintList = new ArrayList<ConfirmPrint>();
ConfirmPrintDto confirmPrintDto = new ConfirmPrintDto();
int fees = 0;
String busiCode = this.getBusiParam().getBusiCode();
if(StringHelper.isNotEmpty(payList.get(0).getCust_id()) ||
StringHelper.isEmpty(payList.get(0).getAcct_id())){
//单位批量缴费或者文件批量缴费
List<String> custIdList = new ArrayList<String>();
//保存缴费信息
for (PayDto payFee:payList){
CProd prod = userProdComponent.queryByProdSn(payFee.getProd_sn());
if (StringHelper.isEmpty(payFee.getAcct_id())){
//文件批量缴费
payFee.setCust_id(prod.getCust_id());
payFee.setAcct_id(prod.getAcct_id());
payFee.setAcctitem_id(prod.getProd_id());
payFee.setUser_id(prod.getUser_id());
payFee.setTariff_id(prod.getTariff_id());
payFee.setInvalid_date(DateHelper.dateToStr(prod.getInvalid_date()));
}
//批量收费功能
if(busiCode.equals(BusiCodeConstants.BATCH_FILE_ACCT_PAY)){
CustFullInfoDto custFullDto = new CustFullInfoDto();
CCust ccust = new CCust();
ccust.setCust_id(prod.getCust_id());
custFullDto.setCust(ccust);
this.getBusiParam().setCustFullInfo(custFullDto);
//只有赠送金额,修改支付方式为赠送
if(payFee.getFee() == 0 && payFee.getPresent_fee() > 0 ){
CFeePayDto payDto = new CFeePayDto();
payDto.setPay_type(SystemConstants.PAY_TYPE_PRESENT);
this.getBusiParam().setPay(payDto);
payFee.setFee(payFee.getPresent_fee());
payFee.setPresent_fee(0);
}
}
//保存缴费记录
if (payFee.getFee()>0 || payFee.getPresent_fee() > 0){
payFee.setBegin_date(payFee.getInvalid_date());
this.saveAcctPay(doneCode, payFee);
//产品原来的订购方式不是订购
if(prod !=null){
//修改公用账目使用类型
changeNoneToAll(doneCode, prod);
}
//保存缴费信息
if (StringHelper.isNotEmpty(payFee.getInvoice_id())) {
//文件批量
CFeePayDto payDto = new CFeePayDto();
payDto.setPay_type(SystemConstants.PAY_TYPE_CASH);
payDto.setPayer(payFee.getCust_name());
feeComponent.savePayFee(payDto, payFee.getCust_id(),doneCode);
//使用发票
feeComponent.saveManualInvoice(doneCode, payFee
.getInvoice_code(), payFee.getInvoice_id(), payFee
.getInvoice_book_id());
invoiceComponent.useInvoice(payFee.getInvoice_code(),payFee.getInvoice_id(),
SystemConstants.INVOICE_MODE_MANUAL, payFee.getFee());
}else if (getBusiParam().getPay()!=null){
}
fees += payFee.getFee(); //确认单打印 总金额项
}
//清除客户临时信用度
acctComponent.clearTempThreshold(payFee.getCust_id());
//生成销账任务
jobComponent.createCustWriteOffJob(doneCode, payFee.getCust_id(), SystemConstants.BOOLEAN_TRUE);
//防止同个客户多次生成计算到期日任务
if(!custIdList.contains(payFee.getCust_id())){
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, payFee.getCust_id());
jobComponent.createAcctModeCalJob(doneCode, payFee.getCust_id());
custIdList.add(payFee.getCust_id());
}
//批量文件收费,为每个客户添加受理记录
if(busiCode.equals(BusiCodeConstants.BATCH_FILE_ACCT_PAY)){
saveAllPublic(doneCode,this.getBusiParam());
doneCode = doneCodeComponent.gDoneCode();
}
this.acctivateBandProd(doneCode, prod);
}
custIdList = null;
//防止拦截器再次调用
// getBusiParam().setPay(null);
//确认单打印 取打印项目名
String printItemId = acctComponent.queryPrintItemId(payList.get(0).getAcctitem_id());
confirmPrintDto.setPrintitem_name(MemoryDict.getDictName(
DictKey.PRINTITEM_NAME, printItemId));
confirmPrintDto.setSum_fee(fees);
}else{
//单客户缴费
//获取客户信息
String custId = getBusiParam().getCust().getCust_id();
List<String> userIds = new ArrayList<String>();//用户编号
boolean includePub = false;//是否包含公用账目缴费
//保存缴费信息
for (PayDto pay:payList){
CProd prod = userProdComponent.queryByProdSn(pay.getProd_sn());
//产品原来的订购方式不是订购
if(prod !=null){
//修改公用账目使用类型
changeNoneToAll(doneCode, prod);
if(prod.getProd_type().equals(SystemConstants.PROD_TYPE_CUSTPKG)){
List<CProd> childrenProd = userProdComponent.queryProdByPackageProd(custId, prod.getProd_id());
for(CProd cp : childrenProd){
if(!userIds.contains(cp.getUser_id())){
userIds.add(cp.getUser_id());
}
}
}
}
//保存缴费记录
if (pay.getFee()>0){
//缴费项目包含公用账目
if(pay.getAcctitem_id().equals(SystemConstants.ACCTITEM_PUBLIC_ID)){
includePub = true;
}
if(StringHelper.isNotEmpty(pay.getUser_id())){
userIds.add(pay.getUser_id());
}
pay.setBegin_date(pay.getInvalid_date());
this.saveAcctPay(doneCode, pay);
//单客户缴费
if(busiCode.equals(BusiCodeConstants.ACCT_PAY)){
ConfirmPrint confirmPrint = confirmPrintDto.new ConfirmPrint();
if(StringHelper.isNotEmpty(pay.getUser_id())){
//确认单打印
CUser userDto = userComponent.queryUserById(pay.getUser_id());
confirmPrint.setUser_name(userDto.getUser_name());
confirmPrint.setUser_type(userDto.getUser_type());
confirmPrint.setUser_type_text(userDto.getUser_type_text());
confirmPrint.setTerminal_type(userDto.getTerminal_type());
confirmPrint.setTerminal_type_text(userDto.getTerminal_type_text());
}else{
confirmPrint.setTerminal_type("");
}
String printItemId = acctComponent.queryPrintItemId(pay.getAcctitem_id());
//确认单打印 取打印项目名
confirmPrint.setPrintitem_name(MemoryDict.getDictName(
DictKey.PRINTITEM_NAME, printItemId));
confirmPrint.setFee(pay.getFee());
confirmPrintList.add(confirmPrint);
doneCodeComponent.saveDoneCodeInfo(doneCode, getBusiParam().getCust().getCust_id(),pay.getUser_id(), new HashMap());
}
fees += pay.getFee(); //确认单打印 总金额项
}
this.acctivateBandProd(doneCode, prod);
}
List<CUser> userList = new ArrayList<CUser>();
//如果缴费项目包括公用账目,则遍历所有用户
if(includePub){
userList = userComponent.queryUserByCustId(custId);
}else{
if(userIds.size() > 0){
userList = userComponent.queryUserByUserIds(userIds);
}
}
for(CUser user : userList){
recoverUserStatus(user, doneCode);
}
//清除客户临时信用度
acctComponent.clearTempThreshold(custId);
//生成销账任务
jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, custId);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
//单客户缴费
if(busiCode.equals(BusiCodeConstants.ACCT_PAY)){
//确认单打印
Collections.sort(confirmPrintList, new Comparator<ConfirmPrint>(){
public int compare(ConfirmPrint o1, ConfirmPrint o2) {
if( StringHelper.isEmpty(o1.getTerminal_type()) )
return -1;
if( StringHelper.isNotEmpty(o2.getTerminal_type()) )
return o2.getTerminal_type().compareTo(o1.getTerminal_type());
else
return 1;
}
});
int count = confirmPrintList.size();
for(int i=0;i<count;i++){
String terminalType = confirmPrintList.get(i).getTerminal_type();
if(StringHelper.isNotEmpty(terminalType)){
for(int j=i+1;j<count;j++){ //设置后面相同终端下的产品对象中终端类型为空
if(terminalType.equals(confirmPrintList.get(j).getTerminal_type())){
confirmPrintList.get(j).setTerminal_type_text("");
}
}
}
}
confirmPrintDto.setData(confirmPrintList);
confirmPrintDto.setCount(count);
}
}
//批量文件收费,为每个客户添加受理记录
if(!busiCode.equals(BusiCodeConstants.BATCH_FILE_ACCT_PAY)){
//批量缴费
if(busiCode.equals(BusiCodeConstants.BATCH_ACCT_PAY)){
String printItemId = acctComponent.queryPrintItemId(payList.get(0).getAcctitem_id());
//确认单打印 取打印项目名
confirmPrintDto.setPrintitem_name(MemoryDict.getDictName(
DictKey.PRINTITEM_NAME, printItemId));
}
confirmPrintDto.setSum_fee(fees);
busiInfo = JsonHelper.fromObject(confirmPrintDto);
getBusiParam().setBusiConfirmParam("info", busiInfo);
// saveAllPublic(doneCode,getBusiParam(),busiInfo);
saveAllPublic(doneCode,getBusiParam());
}
}
}
public List<PayDto> calcBatchPayFees(List<PayDto> payList, Date newInvalidDate,String custId) throws Exception{
if(CollectionHelper.isEmpty(payList)){
return payList;
}
List<CProdDto> allProds = userProdComponent.queryProdByCustId(custId);
Map<String, CProdDto> prodMappedByProdSn = CollectionHelper.converToMapSingle(allProds, "prod_sn");
for(PayDto dto:payList){
CProdDto cProdDto = prodMappedByProdSn.get(dto.getProd_sn());
long feeByInvalidDatePro = userProdComponent.getFeeByInvalidDatePro(cProdDto.getProd_sn(), newInvalidDate);
dto.setFee((int)feeByInvalidDatePro);
}
return payList;
}
private void acctivateBandProd(Integer doneCode, CProd prod) throws Exception {
if(prod != null){
if(StringHelper.isNotEmpty(prod.getUser_id())){
CUser userDto = userComponent.queryUserById(prod.getUser_id());
if(userDto != null && userDto.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
jobComponent.createBusiCmdJob(doneCode,
BusiCmdConstants.ACCTIVATE_PROD, userDto.getCust_id(), userDto.getUser_id(),
null, null, userDto.getModem_mac(), prod.getProd_sn(),prod.getProd_id());
}
}else{
if(prod.getProd_type().equals(SystemConstants.PROD_TYPE_CUSTPKG)){
List<CProd> childProdList = userProdComponent.queryByPkgSn(prod.getProd_sn());
for(CProd childProd : childProdList){
CUser userDto = userComponent.queryUserById(childProd.getUser_id());
if(userDto != null && userDto.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
jobComponent.createBusiCmdJob(doneCode,
BusiCmdConstants.ACCTIVATE_PROD, userDto.getCust_id(), userDto.getUser_id(),
null, null, userDto.getModem_mac(), childProd.getProd_sn(),childProd.getProd_id());
}
}
}
}
}
}
public void saveSinglePay(String acctId,String[] acctitemId, Integer fee[],CBankPay bankPay) throws Exception {
// 获取客户信息
CCust cust = getBusiParam().getCust();
// 获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
// 保存缴费信息
for (int i = 0 ;i<acctitemId.length;i++){
PayDto pay = new PayDto();
pay.setAcct_id(acctId);
pay.setAcctitem_id(acctitemId[i]);
pay.setFee(fee[i]);
this.saveAcctPay(doneCode, pay);
}
List<CUser> userList = userComponent.queryUserByCustId(cust.getCust_id());
for(CUser user : userList){
recoverUserStatus(user, doneCode);
}
if(bankPay != null){
bankPay.setDone_code(doneCode);
feeComponent.saveBankPay(bankPay);
}
//清除客户临时信用度
acctComponent.clearTempThreshold(cust.getCust_id());
//生成销账任务
jobComponent.createCustWriteOffJob(doneCode, cust.getCust_id(), SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, cust.getCust_id());
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, cust.getCust_id());
// printComponent.saveDoc(feeComponent.queryAutoMergeFees(doneCode,cust.getCust_id()), cust
// .getCust_id(), doneCode, busiCode);
saveAllPublic(doneCode,getBusiParam());
}
public int saveBankPk(String bankTransSn, String acctId,String custId,
String acctitemId, Date beginDate,Date endDate, int fee,String userId,String prodSn) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
getBusiParam().setPay(new CFeePayDto());
getBusiParam().getPay().setPay_type(SystemConstants.PAY_TYPE_BANK_DEDU);
getBusiParam().getPay().setReceipt_id(bankTransSn);
//获取客户信息
CCust cust = custComponent.queryCustById(custId);
if (null == cust)
throw new ServicesException("客户已经销户,退款至银行");
CUser userdto = userComponent.queryUserById(userId);
if (userdto==null)
throw new ServicesException("用户已经销户,退款至银行");
if (userdto.getStatus().equals(StatusConstants.REQSTOP)){
//TODO 这里需要判断是否有欠费账单
throw new ServicesException("用户已经报停,退款至银行");
}
CustFullInfoDto custFullInfo = new CustFullInfoDto();
custFullInfo.setCust(cust);
getBusiParam().setCustFullInfo(custFullInfo);
//保存缴费信息
PayDto pay= new PayDto();
if (fee>0){
CProd cprod = userProdComponent.queryByProdSn(prodSn);
if (null == cprod)
throw new ServicesException("对应产品"+prodSn+"项未找到,产品被退订,或者用户被销户");
pay.setCust_id(custId);
pay.setAcct_id(acctId);
pay.setUser_id(userId);
pay.setProd_sn(prodSn);
pay.setAcctitem_id(acctitemId);
pay.setFee(fee);
pay.setBegin_date(DateHelper.dateToStr(cprod.getInvalid_date()));
pay.setInvalid_date(DateHelper.dateToStr(endDate));
this.saveAcctPay(doneCode, pay);
}
//更新银行回盘处理成功信息
CBankReturn cbr2 = new CBankReturn();
cbr2.setBank_trans_sn(bankTransSn);
cbr2.setPay_status("SUCCESS");
cbr2.setPay_done_code(doneCode); // 保存缴费自动注入;
acctComponent.updateBankReturn(cbr2);
recoverUserStatus(userdto, doneCode);
//清除客户临时信用度
acctComponent.clearTempThreshold(custId);
//生成销账任务
jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, custId);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
printComponent.saveDoc(feeComponent.queryAutoMergeFees(doneCode,custId),
custId, doneCode, busiCode);
saveAllPublic(doneCode,getBusiParam());
return doneCode;
}
/**
* 支付平台网账目充值
* @param payList
* @param bankPay
* @throws Exception
*/
public void saveBankProdPay(List<PayDto> payList,CBankPay bankPay) throws Exception{
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
//获取客户信息
String custId = getBusiParam().getCust().getCust_id();
//保存缴费信息
for (PayDto pay:payList){
CProd prod = userProdComponent.queryByProdSn(pay.getProd_sn());
//产品原来的订购方式不是订购
if(prod ==null){
throw new ServicesException("产品"+pay.getProd_sn()+"不存在");
}
//修改公用账目使用类型
changeNoneToAll(doneCode, prod);
pay.setUser_id(prod.getUser_id());
pay.setAcct_id(prod.getAcct_id());
pay.setAcctitem_id(prod.getProd_id());
//保存缴费记录
if (pay.getFee()>0){
pay.setBegin_date(DateHelper.dateToStr(prod.getInvalid_date()));
this.saveAcctPay(doneCode, pay);
}
}
List<CUser> userList = userComponent.queryUserByCustId(custId);
for(CUser user : userList){
recoverUserStatus(user, doneCode);
}
bankPay.setDone_code(doneCode);
feeComponent.saveBankPay(bankPay);
//清除客户临时信用度
acctComponent.clearTempThreshold(custId);
//生成销账任务
jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, custId);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
printComponent.saveDoc(feeComponent.queryAutoMergeFees(doneCode,custId),
custId, doneCode, busiCode);
saveAllPublic(doneCode,getBusiParam());
}
/**
* 协议缴费
*/
public void savePay(String prodSn, int fee, int months,Date beginDate,Date invalidDate) throws Exception {
//获取客户信息
CCust cust = getBusiParam().getCust();
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
//查找产品信息
CProd prod = userProdComponent.queryByProdSn(prodSn);
if (fee>0){
//保存缴费信息
PayDto pay = new PayDto();
pay.setUser_id(prod.getUser_id());
pay.setAcct_id(prod.getAcct_id());
pay.setAcctitem_id(prod.getProd_id());
pay.setFee(fee);
pay.setTariff_id(prod.getTariff_id());
pay.setProd_sn(prodSn);
pay.setBegin_date(DateHelper.dateToStr(prod.getInvalid_date()));
this.saveAcctPay(doneCode, pay);
//计算到期日并更新
invalidDate = userProdComponent.getDate(beginDate, months, 0);
userProdComponent.updateInvalidDate(doneCode, prodSn, invalidDate);
List<CFee> feeList = feeComponent.queryByDoneCode(doneCode);
if(feeList != null && feeList.size() > 0){
//更新缴费的到期日
feeComponent.updateInvalidDate(feeList.get(0).getFee_sn(),prod.getProd_sn(),invalidDate);
}
//修改帐目欠费
acctComponent.changeAcctItemOwefee(false, prod.getAcct_id(), prod.getProd_id(), fee);
//生成账单信息
int billFee=fee/months;
for (int i=0;i<months;i++){
String billingCycle = DateHelper.format(beginDate, DateHelper.FORMAT_YM);
if (i == months -1)
billFee = fee - (months -1)*billFee;
billComponent.createBill(prod, doneCode, billingCycle, billFee,billFee, SystemConstants.BILL_COME_FROM_MANUAL);
beginDate = DateHelper.getNextMonth(beginDate);
}
//生成销帐任务
jobComponent.createCustWriteOffJob(doneCode, cust.getCust_id(),SystemConstants.BOOLEAN_TRUE);
} else {
//修改到期日,并修改产品状态为正常
userProdComponent.updateInvalidDateStatus(doneCode, prodSn, invalidDate,BusiCodeConstants.ACCT_PAY_ZERO);
jobComponent.createCreditExecJob(doneCode, cust.getCust_id());
}
//如果产品状态隔离
if(null != prod && StatusConstants.ISOLATED.equals(prod.getStatus())){
CUser user = userComponent.queryUserById(prod.getUser_id());
recoverUserStatus(user, doneCode);
}
saveAllPublic(doneCode,getBusiParam());
}
public List<CAcctAcctitemInactive> queryPromAcctItemInactive(Integer doneCode, String custId, boolean fromHistory) throws Exception{
return acctComponent.queryPromAcctItemInactive(custId,doneCode,fromHistory);
}
public void cancelPromFee(String promFeeSn, String reason) throws Exception{
Integer doneCode = doneCodeComponent.gDoneCode();
getBusiParam().setRemark(reason);
feeComponent.cancelPromFee(doneCode,promFeeSn,getBusiParam().getCustFullInfo().getCust().getCust_id());
saveAllPublic(doneCode, getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#savePromPayFee(java.lang.String, int, java.util.List)
*/
public void savePromPayFee(String promFeeId, int promFee,
List<PromFeeProdDto> prodList, String preOpenTime) throws Exception {
/*
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
// String busiCode = getBusiParam().getBusiCode();
CCust cust = getBusiParam().getCust();
String custId = getBusiParam().getCust().getCust_id();
//保存促销缴费,记录产品促销信息
CPromFee cPromFee= feeComponent.savePromPay(doneCode,custId,promFeeId,promFee,prodList);
PPromFee promFeeInfo = userComponent.queryPromFeeSimpleInfo(promFeeId);
getBusiParam().getBusiConfirmParamInfo().put("prom_fee", promFeeInfo);
//根据user_id,prod_id 查找并更新对应的prod_sn,rent,tariff_id,prod_id,billing_cycle,should_pay等信息。
//宽带产品自动匹配装入prod_id,返回的map格式Map<user_id,Map<prod_id,PromFeeProdDto>>
Map<String, Map<String, PromFeeProdDto>> promMap=userProdComponent.queryPromFeeProdSn(custId, getOptr().getCounty_id(), prodList);
//绑定产品清单
List<PromFeeProdDto> bindList=new ArrayList<PromFeeProdDto>();
//获取产品用户特殊资源
List<PProdUserRes> userResList = prodComponent.queryUserResByCountyId();
//生效日期
String feeDate = StringHelper.isNotEmpty(preOpenTime) ? preOpenTime : DateHelper.getDate("-");
Date preOpenDate = StringHelper.isNotEmpty(preOpenTime) ? DateHelper.strToDate(preOpenTime) : null;
//标记用户十分已经判断过有产品(只要有产品就有基本包)
Map<String, Boolean> userProdIsEmptyMap = new HashMap<String, Boolean>();
//产品账目充值
Map<String, PProd> prodMap = new HashMap<String, PProd>();
boolean hasBaseProd = false;//标记:如果当前套餐是否包含包含基本产品
for(PromFeeProdDto promProd : prodList){
String prod_id = promProd.getProd_id();
PProd prod = prodComponent.queryProdById(prod_id);
prodMap.put(prod_id, prod);
if(prod.getIs_base().equalsIgnoreCase(SystemConstants.BOOLEAN_TRUE)){
hasBaseProd = true;
}
}
List<UserDto> related_user_list = new ArrayList<UserDto>();
List<String> rulids = new ArrayList<String>();
for(PromFeeProdDto promProd : prodList){
String prodSn = promProd.getProd_sn();;
//如果产品未订购
if(StringHelper.isEmpty(promProd.getProd_sn())){
//用户还没有订购此产品
PProd prod = prodMap.get(promProd.getProd_id());
PProdTariff newTariff = prodComponent.queryTariffById(promProd.getTariff_id());
//装入资费金额
promProd.setRent(newTariff.getRent());
promProd.setBilling_cycle(newTariff.getBilling_cycle());
UserDto user = userComponent.queryUserById(promProd.getUser_id());
//用户下十分以后产品
String user_id = user.getUser_id();
if(userProdIsEmptyMap.get(user_id) == null && !hasBaseProd){//只判断一次,判断过必定不为空
List<CProdDto> userProds = userProdComponent.queryByUserId(user_id);
Boolean userHaveProd = CollectionHelper.isNotEmpty(userProds);
if(!userHaveProd){//外层已经判断了套餐里没有基本产品,如用户本身也没有已经订购基本产品,则跑出异常
String cardId = user.getCard_id();
String baseInfo = user.getTerminal_type_text() ;
if(StringHelper.isNotEmpty(cardId)){
baseInfo += "-" + StringHelper.delStartChar(cardId, cardId.length() -4);
}
throw new ServicesException( baseInfo + " 必须先订基础节目才能参加套餐缴费!");
}
userProdIsEmptyMap.put(user_id, userHaveProd);
}
//判断该产品这个用户能否订购
if(SystemConstants.PROD_SERV_ID_ATV.equals(prod.getServ_id())){
//模拟产品
if(!user.getUser_type().equals(SystemConstants.USER_TYPE_ATV))
throw new ServicesException("非模拟用户:"+prod.getProd_name()+"不适用"+promProd.getUser_name());
}else if(SystemConstants.PROD_SERV_ID_BAND.equals(prod.getServ_id())){
//宽带产品
if(!user.getUser_type().equals(SystemConstants.USER_TYPE_BAND))
throw new ServicesException("非宽带用户:"+prod.getProd_name()+"不适用"+promProd.getUser_name());
}else if(SystemConstants.PROD_SERV_ID_ITV.equals(prod.getServ_id())){
//双向互动
if(!user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)||!user.getServ_type().equals(SystemConstants.DTV_SERV_TYPE_DOUBLE))
throw new ServicesException("非双向互动用户:"+prod.getProd_name()+"不适用"+promProd.getUser_name());
}else if(SystemConstants.PROD_SERV_ID_DTV.equals(prod.getServ_id())){
if(!user.getUser_type().equals(SystemConstants.USER_TYPE_DTV))
throw new ServicesException("非数字用户:"+prod.getProd_name()+"不适用"+promProd.getUser_name());
}else if(SystemConstants.PROD_SERV_ID_RENT.equals(prod.getServ_id())){
}else{
throw new ServicesException("套餐缴费未识别该产品服务类型"+prod.getServ_id());
}
if (prod!=null && null!=newTariff){
String stopByInvalidDate = prodComponent.stopByInvaliddate(prod, newTariff);
if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
prodSn = userProdComponent.addProd(doneCode,custId, user.getAcct_id(), user_id,null,null,
prod.getProd_id(), prod.getProd_type(), SystemConstants.PROD_ORDER_TYPE_PRESENT,
feeDate,null,user.getStop_type(), newTariff, null,stopByInvalidDate,prod.getIs_base(),preOpenDate,prod.getIs_bank_pay());
//如果存在动态资源处理
if(promProd.getResList()!=null&&promProd.getResList().size()>0){
userProdComponent.savePromFeeProdDynRes(prodSn, promProd.getResList());
}
} else {
List<PPackageProd> childList = prodComponent.queryPackageProd(prod.getProd_id(),newTariff.getTariff_id());
prodSn = userProdComponent.addPackage(doneCode,custId, user.getAcct_id(), user_id, prod.getProd_id(), prod.getProd_type(), SystemConstants.PROD_ORDER_TYPE_PRESENT
,feeDate,null, user.getStop_type(),newTariff, childList, null,stopByInvalidDate,prod.getIs_base(),preOpenDate,SystemConstants.BOOLEAN_FALSE);
}
expressionUtil.setCcust(cust);
expressionUtil.setCuser(user);
for (PProdUserRes userRes:userResList){
if (userRes.getProd_id().equals(prod.getProd_id())){
if (StringHelper.isEmpty(userRes.getRule_id_text())
|| expressionUtil.parseBoolean(userRes.getRule_id_text())){
String[] res = userRes.getRes_id().split(",");
for (String resId:res){
userProdComponent.addUserProdres(prodSn, resId);
}
}
}
}
//创建产品账目
acctComponent.createAcctItem(user.getAcct_id(), prod.getProd_id());
//插入预开通记录
if(preOpenDate != null){
//生成预开通JOB等待执行
jobComponent.createPreAuthCmdJob(doneCode,prodSn,preOpenDate,user.getArea_id(),user.getCounty_id());
}else{
jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, cust.getCust_id(),
user_id, user.getStb_id(), user.getCard_id(), user.getModem_mac(), prodSn,prod.getProd_id());
}
}
//处理多个规则给同一个用户使用的情况下,多个规则包含了同样的产品
for(PromFeeProdDto prom : prodList){
if(prom.getUser_id().equals(promProd.getUser_id()) && prom.getProd_id().equals(promProd.getProd_id()) ){
prom.setProd_sn(prodSn);
prom.setTariff_id(promProd.getTariff_id());
prom.setRent(promProd.getRent());
prom.setBilling_cycle(promProd.getBilling_cycle());
prom.setShould_pay(prom.getRent()*prom.getMonths()/prom.getBilling_cycle());
}
}
}
CProd prod = userProdComponent.queryByProdSn(prodSn);
if(prod==null)
throw new ServicesException("系统错误:产品未成功订购.");
//实缴大于(资费*月数/周期)情况下,插入额外账单,如果是包多月,则直接使用实缴插入额外账单
int more_fee=0;
if(promProd.getBilling_cycle()>1&&promProd.getRent()>0){//包多月情况
more_fee=promProd.getReal_pay();
}else {//非包多月
PProdTariff tariff = prodComponent.queryTariffById(prod.getTariff_id());
//包月计费模式要额外生成账单
if(tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH)){
more_fee=(int) (promProd.getReal_pay()- promProd.getRent()*promProd.getMonths()*1.0/promProd.getBilling_cycle());
}
}
if(more_fee>0){
if (promProd.getMonths()==0 ){
String billingCycle = DateHelper.format(
DateHelper.getNextMonthByNum(prod.getInvalid_date().after(new Date())?prod.getInvalid_date():new Date(),0)
, DateHelper.FORMAT_YM);
billComponent.createPromFeeBill(prod, doneCode, billingCycle, more_fee, more_fee);
acctComponent.changeAcctItemOwefee(false, prod.getAcct_id(), prod.getProd_id(), more_fee);
}else{
//账单要求填serv_id
PProd pprod = prodComponent.queryProdById(promProd.getProd_id());
prod.setServ_id(pprod.getServ_id());
int allbill_fee=more_fee;
//实缴每月额外资费
int bill_rent=0;
//第一月账单计算
int first_bill_rent=0;
if(promProd.getBilling_cycle()>1&&promProd.getRent()>0){
bill_rent=(int)(promProd.getReal_pay()*1.0/promProd.getMonths());
first_bill_rent=bill_rent+promProd.getReal_pay()-bill_rent*promProd.getMonths();
}else{
bill_rent=(int) (promProd.getReal_pay()*1.0/promProd.getMonths()- promProd.getRent()*1.0/promProd.getBilling_cycle());
CAcctAcctitem acctitem=acctComponent.queryAcctItemByAcctitemId(prod.getAcct_id(), prod.getProd_id());
int owe_fee =acctitem.getOwe_fee()-acctitem.getActive_balance();
if(owe_fee>0){//使用欠费计算第一个账单基数
first_bill_rent=(1+ (int)(owe_fee*promProd.getBilling_cycle()*1.0/promProd.getRent()+0.5))*bill_rent;
}
}
int bill_month_index=0;
while(allbill_fee>0){
int bill_fee=bill_month_index==0?first_bill_rent:bill_rent;
if(bill_fee>=allbill_fee){
bill_fee=allbill_fee;
allbill_fee=0;
}else{
allbill_fee=allbill_fee-bill_fee;
}
//按到期日来判断开始账单的账期
String billingCycle = DateHelper.format(
DateHelper.getNextMonthByNum(prod.getInvalid_date().after(new Date())?prod.getInvalid_date():new Date(),bill_month_index)
, DateHelper.FORMAT_YM);
billComponent.createPromFeeBill(prod, doneCode, billingCycle, bill_fee, bill_fee);
bill_month_index++;
}
//账户欠费金额修改
acctComponent.changeAcctItemOwefee(false, prod.getAcct_id(), prod.getProd_id(), more_fee);
}
}
//绑定产品
if(StringHelper.isNotEmpty(promProd.getBind_prod_id())){
bindList.add(promProd);
}else{//非绑定到期日产品
//包月资费产品处理缴费
if(promProd.getRent() > 0&&promProd.getBilling_cycle()==1){
//如果实缴金额大于0,记录c_fee信息
if(promProd.getReal_pay() > 0){
PayDto pay = new PayDto();
pay.setProd_sn(prod.getProd_sn());
pay.setTariff_id(prod.getTariff_id());
pay.setCust_id(custId);
pay.setUser_id(prod.getUser_id());
pay.setAcct_id(prod.getAcct_id());
pay.setAcctitem_id(prod.getProd_id());
pay.setFee(promProd.getReal_pay());
if (promProd.getMonths()>0 )
pay.setPresent_fee(promProd.getShould_pay() - promProd.getReal_pay());
pay.setBegin_date(DateHelper.dateToStr(prod.getInvalid_date()));
this.saveAcctPay(doneCode, pay);
}else{
//记录赠送冻结记录
//增加冻结余额
CAcctAcctitemInactive inactiveItem =new CAcctAcctitemInactive();
inactiveItem.setPromotion_sn(cPromFee.getProm_fee_sn());
inactiveItem.setCust_id(custId);
inactiveItem.setAcct_id(prod.getAcct_id());
inactiveItem.setAcctitem_id(prod.getProd_id());
inactiveItem.setCycle(1);
inactiveItem.setActive_amount(promProd.getShould_pay());
inactiveItem.setInit_amount(promProd.getShould_pay());
inactiveItem.setBalance(promProd.getShould_pay());
inactiveItem.setCounty_id(prod.getCounty_id());
inactiveItem.setArea_id(prod.getArea_id());
inactiveItem.setDone_code(doneCode);
acctComponent.addAcctItemInactive(inactiveItem);
//修改产品到期日
userProdComponent.updateInvalidDate(doneCode, promProd.getProd_sn(), 0, promProd.getShould_pay(),
acctComponent.queryAcctItemByAcctitemId(prod.getAcct_id(), prod.getProd_id()));
}
}else {//0资费和包多月资费,直接修改到期日,有实缴则插入缴费
//计算到期日
Date invalidDate = userProdComponent.getDate(prod.getInvalid_date().after(DateHelper.now()) ? prod.getInvalid_date() : DateHelper.now(), promProd.getMonths(), 0);
//保存缴费信息
if (promProd.getReal_pay()>0){
PayDto pay = new PayDto();
pay.setUser_id(prod.getUser_id());
pay.setAcct_id(prod.getAcct_id());
pay.setAcctitem_id(prod.getProd_id());
pay.setFee(promProd.getReal_pay());
pay.setTariff_id(prod.getTariff_id());
pay.setProd_sn(prodSn);
pay.setBegin_date(DateHelper.dateToStr(prod.getInvalid_date()));
pay.setInvalid_date(DateHelper.dateToStr(invalidDate));
this.saveAcctPay(doneCode, pay);
}
//更新到期日
userProdComponent.updateInvalidDate(doneCode, prodSn, invalidDate);
}
}
UserDto user = userComponent.queryUserById(promProd.getUser_id());
if(!rulids.contains(user.getUser_id())){
related_user_list.add(user);
rulids.add(user.getUser_id());
}
//如果是宽带产品,则发激活产品指令
if(SystemConstants.PROD_SERV_ID_BAND.equals(promProd.getServ_id())){
jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, user.getCust_id(),
user.getUser_id(), user.getStb_id(),user.getCard_id(),user.getModem_mac(), promProd.getProd_sn(),promProd.getProd_id());
}
recoverUserStatus(user, doneCode);
}
//绑定产品的到期日处理,排除重复绑定
Map<String,PromFeeProdDto> bindMap=new HashMap<String,PromFeeProdDto>();
for(PromFeeProdDto promProd: bindList){
if(promMap.containsKey(promProd.getUser_id())
&&promMap.get(promProd.getUser_id()).containsKey(promProd.getBind_prod_id())){
PromFeeProdDto bindpromprod=promMap.get(promProd.getUser_id()).get(promProd.getBind_prod_id());
CProd bindprod = userProdComponent.queryByProdSn(bindpromprod.getProd_sn());
promProd.setBind_invalid_date(bindprod.getInvalid_date());
bindMap.put(promProd.getProd_sn(), promProd);
}
}
//按照到期日赠送
for(PromFeeProdDto promProd: bindMap.values()){
CProd prod = userProdComponent.queryByProdSn(promProd.getProd_sn());
if(promProd.getBind_invalid_date().after(new Date())
&&prod.getInvalid_date().before(promProd.getBind_invalid_date())){
if(promProd.getRent()>0&&promProd.getBilling_cycle()==1){
//计算两个到期日之间的需要的金额
int should_pay=
(int) (DateHelper.getDiffDays
(prod.getInvalid_date().after(new Date())?prod.getInvalid_date():new Date()
, promProd.getBind_invalid_date())* promProd.getRent()*12/(promProd.getBilling_cycle()*365.0));
//记录赠送冻结记录
//增加冻结余额
CAcctAcctitemInactive inactiveItem =new CAcctAcctitemInactive();
inactiveItem.setPromotion_sn(cPromFee.getProm_fee_sn());
inactiveItem.setCust_id(custId);
inactiveItem.setAcct_id(prod.getAcct_id());
inactiveItem.setAcctitem_id(prod.getProd_id());
inactiveItem.setCycle(1);
inactiveItem.setActive_amount(should_pay);
inactiveItem.setInit_amount(should_pay);
inactiveItem.setBalance(should_pay);
inactiveItem.setCounty_id(prod.getCounty_id());
inactiveItem.setArea_id(prod.getArea_id());
inactiveItem.setDone_code(doneCode);
acctComponent.addAcctItemInactive(inactiveItem);
//修改产品到期日
userProdComponent.updateInvalidDate(doneCode, promProd.getProd_sn(), 0, should_pay,
acctComponent.queryAcctItemByAcctitemId(prod.getAcct_id(), prod.getProd_id()));
}else{
userProdComponent.updateInvalidDate(doneCode, promProd.getProd_sn(), promProd.getBind_invalid_date());
}
}
}
//保存套餐缴费明细
feeComponent.savePromPayProds(cPromFee, prodList);
jobComponent.createCreditExecJob(doneCode, cust.getCust_id());
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
List<DoneInfoDto> details = new ArrayList<DoneInfoDto>();
int start = 0;
int limit = 20;
Pager<DoneInfoDto> donePager = doneCodeComponent.getPromFeeDate(doneCode,getOptr().getCounty_id(),start,limit);
int counts = 1;
while(donePager.getRecords() !=null && !donePager.getRecords().isEmpty()){
details.addAll(donePager.getRecords());
start += limit * counts;
counts += 1;
donePager = doneCodeComponent.getPromFeeDate(doneCode,getOptr().getCounty_id(),start,limit);
}
String[] users = CollectionHelper.converValueToArray(details, "user_id");
List<CUser> userList = userComponent.queryAllUserByUserIds(users);
for(DoneInfoDto dto:details){
for(CUser user:userList){
if(dto.getUser_id().equals(user.getUser_id())){
String userName = "";
if(StringHelper.isNotEmpty(user.getCard_id())){
userName = user.getUser_type_text()+"-"+ user.getUser_name()+"("+user.getCard_id().substring( user.getCard_id().length()-4, user.getCard_id().length())+")";
}else{
userName = user.getUser_type_text()+"-"+user.getUser_name();
}
dto.setUser_name(userName);
}
}
}
String prod_remark = promFeeInfo.getRemark();
prod_remark = StringHelper.isEmpty(prod_remark) ? "": prod_remark.replaceAll("\n", "</br>").replaceAll("\r", "").replaceAll("\"", "") ;
List<Map<String, Object>> pdlist = new ArrayList<Map<String,Object>>();
Map<String,Object> prodTariffMap = new HashMap<String, Object>();
prodTariffMap.put("prod_name", promFeeInfo.getProm_fee_name());
prodTariffMap.put("tariff_name", "" +(promFee/100) );
prodTariffMap.put("prod_desc", prod_remark);
pdlist.add(prodTariffMap);
for(CUser user:userList){
if(user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)){
CUserDtv userDtv = new CUserDtv();
BeanUtils.copyProperties(user, userDtv);
getBusiParam().addUser(userDtv);
}else if(user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
CUserBroadband userBand = new CUserBroadband();
BeanUtils.copyProperties(user, userBand);
getBusiParam().addUser(userBand);
}else if(user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)){
CUserAtv userAtv = new CUserAtv();
BeanUtils.copyProperties(user, userAtv);
getBusiParam().addUser(userAtv);
}
}
// saveOrderProdDoneInfo(doneCode, pdList );
getBusiParam().setBusiConfirmParam("prod_tariff_list", pdlist);
getBusiParam().setBusiConfirmParam("related_user_list", related_user_list);
doneCodeComponent.saveDoneCodeInfo(doneCode, custId, related_user_list.get(0).getUser_id(), getBusiParam().getBusiConfirmParamInfo());
getBusiParam().getBusiConfirmParamInfo().put("details", details);
saveAllPublic(doneCode,getBusiParam());
*/
}
/**
* 批量修改到期日
* @param payList
* @param newExpDate
* @throws Exception
*/
public void saveBatchEditExpDate(List<PayDto> payList,String newExpDate) throws Exception{
if(null != payList && payList.size() > 0){
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
if(StringHelper.isNotEmpty(payList.get(0).getCust_id())){
for(PayDto pay : payList){
String prodSn = pay.getProd_sn();
Date invalidDate = DateHelper.strToDate(newExpDate);
//查找产品信息
// CProd prod = userProdComponent.queryByProdSn(prodSn);
//修改到期日
userProdComponent.updateInvalidDate(doneCode, prodSn, invalidDate);
}
List<String> custIds = CollectionHelper.converValueToList(payList, "cust_id");
List<String> userIds = CollectionHelper.converValueToList(payList, "user_id");
for (String custId:custIds){
jobComponent.createCreditExecJob(doneCode, custId);
}
getBusiParam().setDoneCode(doneCode);
doneCodeComponent.saveBatchDoneCode(doneCode, getBusiParam().getBusiCode(), getBusiParam().getRemark(), custIds, userIds);
}else{
//获取客户信息
CCust cust = getBusiParam().getCust();
// Map<String,CUser> map = CollectionHelper.converToMapSingle(getBusiParam().getSelectedUsers(), "user_id");
for(PayDto pay : payList){
String prodSn = pay.getProd_sn();
Date invalidDate = DateHelper.strToDate(pay.getNext_invalid_date());
//查找产品信息
// CProd prod = userProdComponent.queryByProdSn(prodSn);
//修改到期日
userProdComponent.updateInvalidDate(doneCode, prodSn, invalidDate);
}
jobComponent.createCreditExecJob(doneCode, cust.getCust_id());
saveAllPublic(doneCode,getBusiParam());
}
}
}
public void savePay(String prodId,String tariffId, int fee,
Date beginDate, Date invalidDate) throws Exception {
//获取客户信息
CUser user = getBusiParam().getSelectedUsers().get(0);
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
//保存缴费信息
PayDto pay = new PayDto();
pay.setUser_id(user.getUser_id());
pay.setAcct_id(user.getAcct_id());
pay.setAcctitem_id(prodId);
pay.setFee(fee);
pay.setTariff_id(tariffId);
pay.setInvalid_date(DateHelper.dateToStr(invalidDate));
this.saveAcctPay(doneCode, pay);
//保存模拟产品账单,产品sn、资费编号为空,账期去当前账期
String billingCycle = DateHelper.format(new Date(), DateHelper.FORMAT_YM);
CProd prod = new CProd();
BeanUtils.copyProperties(user, prod);
prod.setProd_id(prodId);
prod.setTariff_id(tariffId);
BBill bill = billComponent.createBill(prod, doneCode, billingCycle, fee,0, SystemConstants.BILL_COME_FROM_MANUAL);
//生成销账记录
billComponent.createWriteOff(bill,getBusiParam().getCust().getAddr_id());
//保存业务流水
saveAllPublic(doneCode,getBusiParam());
}
public void saveTrans(String sourceAcctId, String sourceAcctItemId,
String orderAcctId, String orderAcctItemId, int fee) throws Exception{
//获取客户信息
CCust cust = getBusiParam().getCust();
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
acctTrans(cust.getCust_id(), doneCode, busiCode,sourceAcctId, sourceAcctItemId,
orderAcctId, orderAcctItemId, fee);
//创建销帐任务
jobComponent.createCustWriteOffJob(doneCode, cust.getCust_id(),SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, cust.getCust_id());
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, cust.getCust_id());
saveAllPublic(doneCode,getBusiParam());
}
/**
* 退款
* @param acctId
* @param acctItemId
* @param userId
* @param fee
* @throws Exception
* 20130401 by wang 记录套餐信息
*/
public void saveRefund(String acctId, String acctItemId,String prodSn,String userId, int fee,String invalidDate,String promFeeSn)
throws Exception {
String custId = getBusiParam().getCust().getCust_id();
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
String tariffId = "";
if(StringHelper.isNotEmpty(promFeeSn)){
userProdComponent.savePromProdRefund(promFeeSn, prodSn.split(","), doneCode,fee);
}
/*if(StringHelper.isNotEmpty(prodSn)){
CProd prod = userProdComponent.queryByProdSn(prodSn);
if(null!= prod){
PProdTariff tariff = prodComponent.queryTariffById(prod.getTariff_id());
tariffId = tariff.getTariff_id();
//如果是包多月的资费
if(tariff.getBilling_cycle() > 1 && SystemConstants.BILLING_TYPE_MONTH.equals(tariff.getBilling_type())
&& tariff.getRent() > 0){
//作废到期日当月后的账单
billComponent.cancelBill(prod.getProd_sn(),DateHelper.formatYM(prod.getInvalid_date()));
//需要作废的账单月份数
int months = (fee * tariff.getBilling_cycle()) / tariff.getRent();
//如果不能整除,费用不足那一月账单也作废
if((fee * tariff.getBilling_cycle()) % tariff.getRent() >0){
months = months + 1;
}
//查询最后一个月份的账单
BBill bill = billComponent.queryLatsBillByProdSn(prod.getProd_sn());
if(null != bill){
String billCycleId = bill.getBilling_cycle_id();
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, Integer.valueOf(billCycleId.substring(0, 4)));
c.set(Calendar.MONTH, Integer.valueOf(billCycleId.substring(4, 6))-1);
//得到作废账单起始月份
c.add(Calendar.MONTH, -months +1);
billCycleId = DateHelper.format(c.getTime(), "yyyyMM");
//作废账单
billComponent.cancelBill(prodSn,billCycleId);
List<CProdPropChange> propChangeList = new ArrayList<CProdPropChange>();
//修改到期日
c.setTime(prod.getInvalid_date());
c.add(Calendar.MONTH, -months);
Date newInvalidDate = c.getTime();
propChangeList.add(new CProdPropChange("invalid_date",
DateHelper.dateToStr(prod.getInvalid_date()),DateHelper.dateToStr(newInvalidDate)));
// userProdComponent.updateInvalidDate(doneCode, prodSn, newInvalidDate);
//修改下次出账日期
c.setTime(prod.getNext_bill_date());
c.add(Calendar.MONTH, -months);
Date newBillDate = c.getTime();
propChangeList.add(new CProdPropChange("next_bill_date",
DateHelper.dateToStr(prod.getNext_bill_date()),DateHelper.dateToStr(newBillDate)));
userProdComponent.editProd(doneCode, prodSn, propChangeList);
}
}
}
}*/
//保存退款记录
PayDto pay = new PayDto();
pay.setUser_id(userId);
pay.setAcct_id(acctId);
pay.setAcctitem_id(acctItemId);
pay.setFee(fee*-1);
pay.setProd_sn(prodSn);
pay.setTariff_id(tariffId);
pay.setInvalid_date(invalidDate);
pay.setBegin_date(invalidDate);
this.saveAcctPay(doneCode, pay);
//生成销账任务
jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, custId);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
saveAllPublic(doneCode,getBusiParam());
}
/*
* 定额赠送退款
* @see com.ycsoft.business.service.IAcctService#dezsRefund(java.lang.String, java.lang.String, java.lang.String, int)
*/
public void dezsRefund(String acctId, String acctItemId, String feeType,
int fee) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = this.getBusiParam().getBusiCode();
CCust cust = getBusiParam().getCust();
String custId = cust.getCust_id();
acctComponent.changeAcctItemBanlance(doneCode, busiCode,
custId, acctId, acctItemId,
SystemConstants.ACCT_CHANGE_REFUND , feeType, -fee, null);
TCountyAcct countyAcct = acctComponent.queryAcctConfig(cust.getCust_colony(),cust.getCounty_id());
//更新定额账户的使用
if(null != countyAcct){
acctComponent.updateCoutyAcct(countyAcct, doneCode, -fee);
}
CProd prod = userProdComponent.queryByAcctItem(acctId, acctItemId);
if(null != prod){
CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(acctId, acctItemId);
userProdComponent.updateInvalidDate(doneCode, prod.getProd_sn(), 0, fee*-1, acctItem);
}else{
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
}
saveAllPublic(doneCode,getBusiParam());
}
public void saveRefundInvlid(String acctId, String acctItemId,
String feeType, int fee) throws Exception {
String custId = getBusiParam().getCust().getCust_id();
String addrId = getBusiParam().getCust().getAddr_id();
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = this.getBusiParam().getBusiCode();
//保存退款记录
PayDto pay = new PayDto();
pay.setAcct_id(acctId);
pay.setAcctitem_id(acctItemId);
pay.setFee(fee*-1);
String payType = SystemConstants.PAY_TYPE_CASH;
if (this.getBusiParam().getPay()!= null && this.getBusiParam().getPay().getPay_type() !=null)
payType = this.getBusiParam().getPay().getPay_type();
feeComponent.saveAcctFee(custId, addrId,pay, doneCode, busiCode, payType);
//更新账目作废记录金额
acctComponent.createAcctitemInvalid(custId, acctId, acctItemId, doneCode, busiCode, feeType, fee*-1);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
saveAllPublic(doneCode,getBusiParam());
}
public void saveAcctFree(String acctId, String acctItemId, String prodSn,
int fee, String feeType) throws Exception {
CProd prod = userProdComponent.queryByProdSn(prodSn);
CUser user = userComponent.queryUserById(prod.getUser_id());
String ofl = "";
if(user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
ofl = acctComponent.queryTemplateConfig(TemplateConfigDto.Config.BAND_OWE_FEE_NUMBER.toString());
}else{
ofl = acctComponent.queryTemplateConfig(TemplateConfigDto.Config.OWE_FEE_NUMBER.toString());
}
if(StringHelper.isNotEmpty(ofl)){
int ownFeeNumber = Integer.parseInt(ofl); //最新配置 欠费天数
int rent = prodComponent.queryTariffById(prod.getTariff_id()).getRent();
if(fee * -1 > ((float)rent/30)*ownFeeNumber) //抹零金额不能大于 产品每天资费*配置天数
throw new ServicesException("当前基本包欠费天数为: "+ownFeeNumber);
}
this.saveAdjust(acctId, acctItemId, prodSn, fee, feeType, SystemConstants.ADJUST_REASON_OWNFEE);
}
public void saveAdjust(String acctId, String acctItemId, String prodSn,
int fee, String feeType, String reason) throws Exception {
//获取客户信息
CCust cust = getBusiParam().getCust();
CProd prod = userProdComponent.queryByProdSn(prodSn);
if(StringHelper.isNotEmpty(feeType) && feeType.equals(SystemConstants.ACCT_FEETYPE_ADJUST_EASY)){
String day = acctComponent.getAdjustDay();
if(StringHelper.isEmpty(day)){
throw new ServicesException("模板没有配置小额减免天数,保存失败");
}
PProdTariff tariff = userProdComponent.queryProdTariffById(prod.getTariff_id());
List<CAcctAcctitemAdjust> adjustList = acctComponent.queryAdjustFee(acctId, acctItemId,feeType);
int adjustFee =0;
for(CAcctAcctitemAdjust dto:adjustList){
adjustFee+=dto.getAjust_fee();
}
double realFee = (float)(tariff.getRent()/(float)(tariff.getBilling_cycle()*30))*Integer.parseInt(day);
double canFee = adjustFee+realFee;
DecimalFormat df = new DecimalFormat("###,###,###.##");
double rate = Double.valueOf(df.format((double)canFee/100));
if(canFee + fee < 0 ){
throw new ServicesException("不能超过本月调账剩余额度["+rate+"],保存失败");
}
}
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
if (StringHelper.isEmpty(feeType))
feeType = SystemConstants.ACCT_FEETYPE_ADJUST;
acctComponent.addAdjust(doneCode, acctId, acctItemId, fee,feeType, reason,getBusiParam().getRemark());
CAcctAcctitem acctitem = acctComponent.queryAcctItemByAcctitemId(acctId, acctItemId);
if (acctitem!=null){//账目还存在
//创建账单
String billingCycle = DateHelper.format(new Date(), DateHelper.FORMAT_YM);
if (prod == null){
prod = new CProd();
BeanUtils.copyProperties(cust, prod);
prod.setAcct_id(acctId);
prod.setProd_id(acctItemId);
}
String comeFrom = SystemConstants.BILL_COME_FROM_ADJUST;
if(SystemConstants.ACCT_FEETYPE_ADJUST_KT.equals(feeType))
comeFrom = SystemConstants.BILL_COME_FROM_ADJUST_KT;
billComponent.createBill(prod, doneCode, billingCycle, fee,fee, comeFrom);
//创建销帐任务
jobComponent.createCustWriteOffJob(doneCode, cust.getCust_id(),SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, cust.getCust_id());
//到期日更新更新
acctComponent.changeAcctItemOwefee(false, acctId, acctItemId, fee);
//修改产品对应的到期日
CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(acctId, acctItemId);
userProdComponent.updateInvalidDate(doneCode, prodSn,0, fee*-1, acctItem);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode ,cust.getCust_id());
} else {
//账目不存在
throw new ServicesException("账目已经被删除,无法调账");
}
saveAllPublic(doneCode,getBusiParam());
}
public int saveAcctUnfreeze(CAcctAcctitemInactive unfreezeJob)throws Exception{
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
String custId = unfreezeJob.getCust_id();
String acctId = unfreezeJob.getAcct_id();
String acctItemId = unfreezeJob.getAcctitem_id();
String feeType = SystemConstants.ACCT_FEETYPE_PRESENT;
String sn = StringHelper.isEmpty(unfreezeJob.getFee_sn())?unfreezeJob.getPromotion_sn():unfreezeJob.getFee_sn();
int fee = unfreezeJob.getActive_amount()>=unfreezeJob.getBalance()?unfreezeJob.getBalance():unfreezeJob.getActive_amount();
int cycle =unfreezeJob.getCycle();
//修改账目余额
acctComponent.changeAcctItemBanlance(doneCode, BusiCodeConstants.ACCT_UNFREEZE,
custId, acctId, acctItemId, SystemConstants.ACCT_CHANGE_UNFREEZE, feeType, fee, unfreezeJob.getDone_code());
//修改冻结资金余额,并更新下次返回日期
acctComponent.changeAcctitemInactive(unfreezeJob.getBalance(), acctId, acctItemId, sn, fee, cycle);
jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, custId);
//保存流水
saveDoneCode(doneCode, BusiCodeConstants.ACCT_UNFREEZE, custId);
return fee;
}
/**
* 删除指定账户或账目
* @param acctId
* @param acctItemId
* @throws Exception
*/
public void saveDelAcctItem(String acctId, String acctItemId,Integer doneCode)
throws Exception {
String busiCode = this.getBusiParam().getBusiCode();
CDoneCode cDoneCode = doneCodeComponent.queryByKey(doneCode);
if(cDoneCode != null){
busiCode = cDoneCode.getBusi_code();
}
CAcct acct = acctComponent.queryByAcctId(acctId);
if (StringHelper.isEmpty(acctItemId)){
acctComponent.removeAcctWithHis(acct, doneCode,busiCode);
} else {
acctComponent.removeAcctItemWithoutHis(acct.getCust_id(),acctId, acctItemId, doneCode,busiCode);
}
//信控任务
jobComponent.createCreditCalJob(doneCode, acct.getCust_id(), null, SystemConstants.BOOLEAN_TRUE);
}
/**
* 补入非公用账目充值的账目异动数据
* @param changeList
* @param doneCode
*/
public void saveAdjustSpecAcctPay(List<CAcctAcctitemChange> changeList,Integer doneCode) throws Exception{
acctComponent.saveAdjustSpecAcctPay(changeList, doneCode);
}
public void saveCancelBill(String[] billSns) throws Exception {
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = this.getBusiParam().getBusiCode();
CCust cust = this.getBusiParam().getCust();
//普通包多月和套餐缴费的包多月判断到期日
Map<String,PProdTariff> tariffMap=new HashMap<String,PProdTariff>();//资费缓存
Map<String,Integer> prodSnInvalidMap=new HashMap<String,Integer>();//产品SN到期日月数判断
for(String billSn : billSns){
//查找账单信息以及账单对应的账目信息
BBill bill = billComponent.queryBillBySn(billSn);
if(bill.getCome_from().equals(SystemConstants.BILL_COME_FROM_MUCH)){
//包多月账单
Integer months=prodSnInvalidMap.get(bill.getProd_sn());
if(months==null){
prodSnInvalidMap.put(bill.getProd_sn(), 1);
}else{
prodSnInvalidMap.put(bill.getProd_sn(), months+1);
}
}
if(bill.getCome_from().equals(SystemConstants.BILL_COME_FROM_PROM)){
//套餐缴费中包多月或0资费的账单
if(bill.getTariff_id()!=null){
PProdTariff tariff=tariffMap.get(bill.getTariff_id());
if(tariff==null){
tariff=prodComponent.queryTariffById(bill.getTariff_id());
tariffMap.put(bill.getTariff_id(), tariff);
}
if(tariff!=null&&(tariff.getBilling_cycle()>1||tariff.getRent()==0)){
Integer months=prodSnInvalidMap.get(bill.getProd_sn());
if(months==null){
prodSnInvalidMap.put(bill.getProd_sn(), 1);
}else{
prodSnInvalidMap.put(bill.getProd_sn(), months+1);
}
}
}
}
CAcctAcctitem acctItem = this.acctComponent.queryAcctItemByAcctitemId(bill.getAcct_id(), bill.getAcctitem_id());
//查找账单的销账记录
List<BBillWriteoff> writeOffList = this.billComponent.queryWriteOffByBill(billSn);
for ( BBillWriteoff writeOff :writeOffList){
if (acctItem != null){
//更新账目余额
this.acctComponent.changeAcctItemBanlance(doneCode, busiCode,
bill.getCust_id(), bill.getAcct_id(), bill.getAcctitem_id(), SystemConstants.ACCT_CHANGE_UNWRITEOFF,
writeOff.getFee_type(), writeOff.getFee(), null);
if(0<writeOffList.size() && bill.getStatus().equals("1") && busiCode.equals(BusiCodeConstants.CANCEL_B_BILL)){
//还原欠费
this.acctComponent.changeAcctItemOwefee(false, bill.getAcct_id(), bill.getAcctitem_id(), writeOff.getFee());
}
} else {
//插入新的作废金额
this.acctComponent.createAcctitemInvalid(bill.getCust_id(), bill.getAcct_id(), bill.getAcctitem_id()
, doneCode, busiCode
, writeOff.getFee_type(),writeOff.getFee());
}
//删除销账记录
this.billComponent.cancelWriteOff(writeOff, doneCode);
}
//已出账已销账
if(0<writeOffList.size() && bill.getStatus().equals("1") && busiCode.equals(BusiCodeConstants.CANCEL_B_BILL)){
//更新欠费金额
this.acctComponent.changeAcctItemOwefee(false, bill.getAcct_id(), bill.getAcctitem_id(), bill.getFinal_bill_fee()*-1);
}
//已出账未销账
if(0==writeOffList.size() && bill.getStatus().equals("1") && busiCode.equals(BusiCodeConstants.CANCEL_B_BILL)){
//更新欠费金额
this.acctComponent.changeAcctItemOwefee(false, bill.getAcct_id(), bill.getAcctitem_id(), bill.getOwe_fee()*-1);
}
//实时账单
if(0==writeOffList.size() && bill.getStatus().equals("0") && busiCode.equals(BusiCodeConstants.CANCEL_B_BILL)){
//更新欠费金额
this.acctComponent.changeAcctItemOwefee(true, bill.getAcct_id(), bill.getAcctitem_id(), 0);
//清空月租
this.billComponent.deleteRentfee(billSn,bill.getProd_sn(),bill.getAcct_id(), bill.getAcctitem_id());
//费用作废
this.billComponent.updateFeeStatus(billSn);
}
//包多月未出帐
if (0 == writeOffList.size() && bill.getStatus().equals("0")
&& bill.getFee_flag().equals(SystemConstants.BILL_FEE_FLAG_DY)
&& busiCode.equals(BusiCodeConstants.CANCEL_B_BILL)) {
//更新欠费金额
this.acctComponent.changeAcctItemOwefee(true, bill.getAcct_id(), bill.getAcctitem_id(), 0);
}
//更新账单状态为作废状态
this.billComponent.cancelBill(billSn);
}
//普通包多月或者套餐缴费中的包多月的到期日判断
if(prodSnInvalidMap.size()>0){
Iterator<String> it= prodSnInvalidMap.keySet().iterator();
while(it.hasNext()){
String prodSn=it.next();
CProd cprod= userProdComponent.queryByProdSn(prodSn);
int months=prodSnInvalidMap.get(prodSn);
if(cprod!=null){
Date invalidDate=DateHelper.getNextMonthByNum(cprod.getInvalid_date(),months*-1 );
if(invalidDate.before(DateHelper.today())){
invalidDate=DateHelper.today();
}
userProdComponent.updateInvalidDate(doneCode, prodSn,invalidDate );
}
}
}
//创建销帐任务
jobComponent.createCustWriteOffJob(doneCode, cust.getCust_id(),SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, cust.getCust_id());
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode ,cust.getCust_id());
saveAllPublic(doneCode,getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryAcctByCustId(java.lang.String)
*/
public List<AcctDto> queryAcctByCustId(String custId) throws Exception {
CCust cust = custComponent.queryCustById(custId);
return acctComponent.queryAcctsEsayByCustId(cust);
}
/**
* 查询公用账目余额
* @param custId
* @return
* @throws Exception
*/
public List<AcctitemDto> queryPublicAcctItemByCustId(String custId) throws Exception{
CAcct acct= acctComponent.queryCustAcctByCustId(custId);
if(acct != null){
List<AcctitemDto> list = new ArrayList<AcctitemDto>();
AcctitemDto t = acctComponent.queryAcctItemDtoByAcctitemId(acct.getAcct_id(), SystemConstants.ACCTITEM_PUBLIC_ID);
list.add(t);
return list;
}
return null;
}
public List<AcctitemDto> queryAcctitemToCallCenter(Map<String,Object> params) throws Exception{
return acctComponent.queryAcctitemToCallCenter(params);
}
/**
* 查询产品的账户信息
* @param custIds
* @return
* @throws Exception
*/
public List<UnitPayDto> queryBaseProdAcctItems(String[] custIds,String prodId)
throws Exception {
return acctComponent.queryBaseProdAcctItems(custIds,prodId);
}
/**
* 单位缴费,查询可以缴费的产品
* @param custIds
* @return
*/
public List<CProd> querySelectableProds(String[] custIds) throws Exception {
return acctComponent.querySelectableProds(custIds);
}
/**
* @see com.ycsoft.business.component.core.AcctComponent#queryAcctitemActiveByAcctitemId(java.lang.String)
*/
public List<AcctAcctitemActiveDto> queryActive(String acctId,
String acctitemId) throws Exception {
List<AcctAcctitemActiveDto> actives = acctComponent.queryActiveById(
acctId, acctitemId);
for (int i = actives.size() - 1; i >= 0; i--) {
AcctAcctitemActiveDto active = actives.get(i);
if (active.getBalance().compareTo(0) == 0) {
actives.remove(i);
}
}
return actives;
}
/**
* @see com.ycsoft.business.component.core.AcctComponent#queryInactive(java.lang.String)
*/
public List<CAcctAcctitemInactive> queryAcctitemInactive(
String acctId,String acctitemId) throws JDBCException {
return acctComponent.queryInactive(acctId,acctitemId);
}
/**
* @see com.ycsoft.business.component.core.AcctComponent#queryOrder(java.lang.String)
*/
public List<CAcctAcctitemOrder> queryAcctitemOrder(
String acctId,String acctitemId) throws JDBCException {
return acctComponent.queryOrder(acctId,acctitemId);
}
/**
* @see com.ycsoft.business.component.core.AcctComponent#queryThreshold(java.lang.String)
*/
public List<CAcctAcctitemThreshold> queryAcctitemThreshold(
String acctId,String acctitemId) throws Exception {
return acctComponent.queryThreshold(acctId,acctitemId);
}
public void updateThreshold(List<CAcctAcctitemThresholdProp> thresholdPropList) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
acctComponent.updateThreshold(thresholdPropList,doneCode);
saveAllPublic(doneCode, getBusiParam());
String custId = getBusiParam().getCust().getCust_id();
//信控任务
jobComponent.createCreditExecJob(doneCode, custId);
}
public List<AcctAcctitemThresholdDto> queryThresholdByAcctId(String custId,String[] acctIds) throws Exception {
Map<String, CUser> userMap = CollectionHelper.converToMapSingle(
userComponent.queryUserByCustId(custId), "user_id");
List<AcctAcctitemThresholdDto> list = acctComponent.queryThresholdByAcctId(acctIds);
for (AcctAcctitemThresholdDto dto : list) {
// 设置用户信息
if (StringHelper.isNotEmpty(dto.getUser_id())) {
CUser user = userMap.get(dto.getUser_id());
if (user != null)
PropertyUtils.copyProperties(dto, user);
}
}
return list;
}
public List<AcctAcctitemThresholdDto> queryThresholdByCustId(
QueryAcctitemThresholdDto dto, String custId, String[] acctIds)
throws Exception {
return acctComponent.queryThresholdByCustId(dto, custId, acctIds);
}
/**
* @see com.ycsoft.business.component.core.AcctComponent#queryAcctitemChange(java.lang.String)
*/
public Pager<CAcctAcctitemChange> queryAcctitemChange(
String acctId,String acctitemId,Integer start, Integer limit) throws JDBCException {
return acctComponent.queryAcctitemChange(acctId,acctitemId,start,limit);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#saveSignBank(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
public void saveSignBank(CBankAgree cBankAgree) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
CCust cust = getBusiParam().getCust();
String acctId = acctComponent.queryCustAcctByCustId(cust.getCust_id()).getAcct_id();
acctComponent.saveSignBank(doneCode,acctId,cust,cBankAgree);
//生成计算信用度任务
jobComponent.createCreditCalJob(doneCode, cust.getCust_id(), null,SystemConstants.BOOLEAN_TRUE);
saveAllPublic(doneCode,getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#deleteSignBack(java.lang.String, com.ycsoft.beans.core.bank.CBankAgree)
*/
public void saveRemoveSignBank(String bankPayType,Date time) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String custId = getBusiParam().getCust().getCust_id();
String acctId = acctComponent.queryCustAcctByCustId(getBusiParam().getCust().getCust_id()).getAcct_id();
//return null;
acctComponent.removeSignBank(doneCode ,acctId, custId,bankPayType,time);
//生成计算信用度任务
jobComponent.createCreditCalJob(doneCode, custId, null, SystemConstants.BOOLEAN_TRUE);
saveAllPublic(doneCode,getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#querySignBank()
*/
public CAcctBank querySignBank(String bankPayType) throws Exception {
String custId = getBusiParam().getCust().getCust_id();
String acctId = acctComponent.queryCustAcctByCustId(custId).getAcct_id();
return acctComponent.querySignBankByAcctId(acctId,bankPayType);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryAcctitemAdjust(java.lang.String, java.lang.String)
*/
public List<CAcctAcctitemAdjust> queryAcctitemAdjust(String acctId,
String acctItemId) throws JDBCException {
return acctComponent.queryAdjust(acctId, acctItemId);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryCompanyAcct()
*/
public List<CGeneralAcct> queryCompanyAcct() throws Exception {
return acctComponent.queryCompanyAcct();
}
public void editAdjustReason(Integer doneCode,String reason) throws Exception {
acctComponent.editAdjustReason(doneCode,reason);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#editCompanyAcct(java.util.List)
*/
public void editCompanyAcct(List<CGeneralAcct> generalAcctList) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
acctComponent.updateGeneralAcct(generalAcctList);
for(CGeneralAcct generalAcct : generalAcctList){
if(generalAcct.getChangeBalance() != 0){
//记录非公司账户费用
feeComponent.saveGeneralAcctFee(generalAcct.getG_acct_id(),generalAcct.getChangeBalance(), doneCode, generalAcct.getCounty_id());
}
}
saveAllPublic(doneCode,getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#addCredential(java.lang.String, java.lang.Integer, java.lang.Integer, java.lang.Integer)
*/
public void addCredential(String contractId, Integer credentialStartNo,
Integer credentialEndNo, Integer credentialAmount) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
//更新合同总金额
CGeneralContract contract = acctComponent.queryGeneralContractById(contractId);
int change = (credentialEndNo-credentialStartNo + 1) * credentialAmount;
contract.setTotal_amount(contract.getTotal_amount() + change);
acctComponent.updateGeneralContract(contract);
//保存合同凭据
List<CGeneralCredential> generalCredentialList = new ArrayList<CGeneralCredential>();
if(null != credentialEndNo){
for(int i=credentialStartNo;i<=credentialEndNo;i++){
CGeneralCredential generalCredential = new CGeneralCredential();
generalCredential.setContract_id(contract.getContract_id());
generalCredential.setCredential_no(i+"");
generalCredential.setAmount(credentialAmount);
generalCredential.setBalance(credentialAmount);
generalCredentialList.add(generalCredential);
}
}
acctComponent.saveGeneralCredentialList(generalCredentialList);
saveAllPublic(doneCode,getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryCredential(java.lang.String, java.lang.Integer, java.lang.Integer)
*/
public Pager<CGeneralCredential> queryCredential(String contractId,
Integer start, Integer limit) throws JDBCException {
return acctComponent.queryCredential(contractId,start,limit);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryPayInfo(java.lang.String, java.lang.Integer, java.lang.Integer)
*/
public Pager<CGeneralContractPay> queryPayInfo(String contractId,
Integer start, Integer limit) throws JDBCException {
return acctComponent.queryPayInfo(contractId,start,limit);
}
/**
* 预扣费接口
*/
public String vodPreFee(String transId, String userId, String prodId,
String progId, String progName, Date requestTime, int price,
String detailParams) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = this.getBusiParam().getBusiCode();
//处理结果,三部分组成,价格和需要充值的金额,账目余额,分号隔开
String result = "";
//是否需要处理预扣费,false需要处理
boolean needDeal = false;
//判断是否是24小时内重复请求
CAcctPreFee oldacctPreFee = acctComponent.queryByProgId(userId, prodId, progId);
if(null != oldacctPreFee){
long time = (requestTime.getTime() - oldacctPreFee.getFee_time().getTime())/(1000 * 3600);
//如果请求时间小于24小时
if(time <= SystemConstants.VOD_TIME_FORFREE){
result = 0 + ";";
needDeal = true;
}
}
if(!needDeal){
//价格
int fee=0; int needFee=0;
//根据prodId,userId获取用户产品信息(基本产品)
CProd cProd = userProdComponent.queryByProdId(userId, prodId);
//根据资费编号获取资费信息
PProdTariff tariff = userProdComponent.queryProdTariffById(cProd.getTariff_id());
if (StringHelper.isNotEmpty(tariff.getUse_fee_rule()) || StringHelper.isNotEmpty(tariff.getRule_id())){
//根据规则计算fee
TRuleDefine rule = expressionUtil.queryByRuleId(tariff.getRule_id());
String preBillingRule = null;//根据rule_id获取
if(null != rule){
preBillingRule = rule.getPre_billing_rule();
}
if (StringHelper.isEmpty(preBillingRule)){
fee=0;
} else if (SystemConstants.PRE_FEE_PRICE.equals(preBillingRule)){
fee = price;
} else {
//根据规则计算
}
} else {
fee=0;
}
//如果价格大于0
//根据prodSn获取账目信息
CAcctAcctitem acctitem = null;
List<AcctitemDto> acctitemList = acctComponent.queryAcctItemByUserId(userId);
for(AcctitemDto dto : acctitemList){
if(dto.getAcctitem_id().equals(cProd.getProd_id())){
acctitem = dto;
break;
}
}
//获取累计预扣款总额
/**
* 不用获取,直接通过本月费用获取
*/
int totalPreFee =0;
// List<CAcctPreFee> acctPreFeeList = acctComponent.queryByUserIdandProdId(userId, prodId);
// if(null !=acctPreFeeList && acctPreFeeList.size()>0){
// for(CAcctPreFee preFee : acctPreFeeList){
// totalPreFee = totalPreFee + preFee.getFee();
// }
// }
//获取账目余额
int acctBalance = acctitem.getActive_balance() - acctitem.getOrder_balance() -
acctitem.getReal_fee() - totalPreFee ;
//获取需要转账金额
int needTransFee = acctitem.getActive_balance() - acctitem.getOrder_balance() -
acctitem.getReal_fee() - totalPreFee - fee;
if (fee>0){
if (needTransFee < 0){
//获取公用账目信息
CAcct acct = acctComponent.queryCustAcctByCustId(cProd.getCust_id());
CAcctAcctitem publicAcctItem= acctComponent.queryAcctItemByAcctitemId(acct.getAcct_id(), SystemConstants.ACCTITEM_PUBLIC_ID);
int canTransFee = publicAcctItem.getCan_trans_balance();
acctBalance = acctBalance +canTransFee;
//可转余额小于需要转的余额
if (canTransFee<-needTransFee){
needFee = (canTransFee + needTransFee);
result = fee + ";" + (canTransFee + needTransFee)+";"+acctBalance;
fee = canTransFee + needTransFee;
} else {
needFee = (canTransFee + needTransFee);
result = fee + ";0;"+acctBalance;
//做账户转账
acctComponent.trans(cProd.getCust_id(), doneCode, busiCode,
publicAcctItem.getAcct_id(), publicAcctItem.getAcctitem_id(),
acctitem.getAcct_id(), acctitem.getAcctitem_id() ,-needTransFee);
//生成账务模式判断任务
jobComponent.createAcctModeCalJob(doneCode, cProd.getCust_id());
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, cProd.getCust_id());
}
}else{
needFee = 0;
result = fee +";0;"+acctBalance;
}
//记录预扣费信息 如果费用大于0 同时 需要充值金额等于0
if(fee > 0 && needFee==0){
CAcctPreFee acctPreFee = new CAcctPreFee(doneCode,cProd.getCust_id(),userId,acctitem.getAcct_id(),
acctitem.getAcctitem_id(),prodId,fee,requestTime,cProd.getArea_id(),cProd.getCounty_id(),
progName,transId,detailParams,new Date(),SystemConstants.BOOLEAN_TRUE,progId);
//设置为有效扣费
acctPreFee.setIs_valid("T");
acctComponent.saveCAcctPreFee(acctPreFee);
//更新账单
BBill bill = billComponent.queryLatsBillByProdSn(cProd.getProd_sn());
if(null == bill){
BBill bbill = billComponent.createVodBill(cProd, doneCode, DateHelper.format(new Date(), DateHelper.FORMAT_YM), fee, fee, "1");
//出账
billComponent.confirmBill(bbill.getProd_sn(), doneCode);
}else{
billComponent.updateBill(cProd.getProd_sn(),bill.getOwe_fee()+fee);
//出账
billComponent.confirmBill(cProd.getProd_sn(), doneCode);
}
//更新欠费字段
acctComponent.changeAcctItemOwefee(true, acctitem.getAcct_id(), acctitem.getAcctitem_id(), fee);
//插入实时销账任务
jobComponent.createCustWriteOffJob(doneCode, cProd.getCust_id(), SystemConstants.BOOLEAN_TRUE);
//生成账务模式判断任务
jobComponent.createAcctModeCalJob(doneCode, cProd.getCust_id());
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode, cProd.getCust_id());
}
}else{
result = fee + ";0;"+acctBalance;
}
}
saveAllPublic(doneCode,this.getBusiParam());
return result;
}
/**
* 取消预扣费接口
*/
public void cancelVodPreFee(String transId,String userId) throws Exception{
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = this.getBusiParam().getBusiCode();
if(StringHelper.isEmpty(busiCode)){
busiCode = BusiCodeConstants.CANCEL_VOD_PRE_FEE;
this.getBusiParam().setBusiCode(busiCode);
}
//取消预扣款
CAcctPreFee acctPreFee = acctComponent.queryByTransId(transId, userId);
acctPreFee.setStatus(SystemConstants.BOOLEAN_FALSE);
acctPreFee.setCancel_time(new Date());
acctComponent.updateAcctPreFee(acctPreFee);
//取消转账
acctComponent.cancelTrans(acctPreFee.getDone_code(), busiCode);
saveAllPublic(doneCode,this.getBusiParam());
}
/**
* 任务处理,取消预扣费接口
* @param acctPreFee
* @throws Exception
*/
public void cancelVodPreFee(CAcctPreFee acctPreFee) throws Exception{
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = this.getBusiParam().getBusiCode();
if(StringHelper.isEmpty(busiCode)){
busiCode = BusiCodeConstants.CANCEL_VOD_PRE_FEE;
this.getBusiParam().setBusiCode(busiCode);
}
acctPreFee.setStatus(SystemConstants.BOOLEAN_FALSE);
acctPreFee.setCancel_time(new Date());
acctComponent.updateAcctPreFee(acctPreFee);
//取消转账
acctComponent.cancelTrans(acctPreFee.getDone_code(), busiCode);
saveAllPublic(doneCode,this.getBusiParam());
}
public List<CAcctPreFee> queryVodPreFees(String cardId) throws Exception{
return acctComponent.queryVodPreFees(cardId);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryCompanyWithOutAcct()
*/
public List<SDept> queryCompanyWithOutAcct() throws Exception {
return acctComponent.queryCompanyWithOutAcct();
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#saveGeneralAcct(com.ycsoft.beans.core.acct.CGeneralAcct)
*/
public void saveGeneralAcct(CGeneralAcct generalAcct) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
generalAcct.setType(SystemConstants.General_ACCT_TYPE_COMPANY);
//保存分公司账户
acctComponent.saveGeneralAcct(generalAcct);
//记录非公司账户费用
feeComponent.saveGeneralAcctFee(generalAcct.getG_acct_id(),generalAcct.getBalance(), doneCode,generalAcct.getCounty_id());
saveAllPublic(doneCode,getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#saveGeneralContract(com.ycsoft.beans.core.acct.CGeneralContract)
*/
public void saveGeneralContract(CGeneralContract generalContract, CFeePayDto pay,
SOptr optr, Integer credentialStartNo, Integer credentialEndNo,
Integer credentialAmount, Integer presentAmount) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String payType = pay.getPay_type();
//验证合同号不重复
String contractNo = generalContract.getContract_no();
CGeneralContract contract = acctComponent.queryByContractNo(contractNo);
if(null != contract){
throw new ServicesException("合同号"+contractNo+"已经存在,不能重复");
}
String busiCode = getBusiParam().getBusiCode();
//非营业收费 无cust,默认cust_id=111
String custId = "111";
pay.setFee(generalContract.getNominal_amount());
CFeePayDto feePay = feeComponent.savePayFeeNew(pay, custId, doneCode);
RInvoice invoice = invoiceComponent.queryInvoiceById(pay.getInvoice_id()).get(0);
CFee fee = feeComponent.saveFeeUnitpre(payType, generalContract
.getFee_id(), generalContract.getFee_type(), generalContract
.getNominal_amount(), doneCode, doneCode, busiCode,
SystemConstants.BOOLEAN_FALSE,generalContract.getAddr_district(), feePay.getPay_sn(), custId, invoice);
String[] feeSns = {fee.getFee_sn()};
invoiceComponent.useInvoice(invoice.getInvoice_code(), invoice.getInvoice_id(), invoice.getInvoice_mode(), generalContract.getNominal_amount());
printComponent.saveDoc(feeComponent.queryAutoMergeFees(feeSns), null,
doneCode, getBusiParam().getBusiCode());
int total = 0;
if(null != credentialEndNo && credentialEndNo > 0){
total = (credentialEndNo-credentialStartNo + 1) * credentialAmount;
generalContract.setTotal_amount(total);
}
generalContract.setFee_sn(fee.getFee_sn());
//如果是分期付款
if(SystemConstants.PAY_TYPE_DELEYPAY.equals(payType)){
generalContract.setPayed_amount(0);
}else{
generalContract.setPayed_amount(generalContract.getNominal_amount());
}
acctComponent.saveGeneralContract(generalContract);
//保存合同凭据
if(total != 0){
presentAmount = total - generalContract.getNominal_amount();
if(presentAmount < 0){
presentAmount = 0;
}
DecimalFormat df = new DecimalFormat("#.00");
double rate = Double.valueOf(df.format((double)presentAmount/(double)total));
int percent = (int) (rate * 100);
//保存合同凭据明细
CGeneralContractDetail contractDetail = new CGeneralContractDetail();
contractDetail.setContract_id(generalContract.getContract_id());
contractDetail.setCredential_amount(credentialAmount);
contractDetail.setPercent(percent);
contractDetail.setCredential_start_no(credentialStartNo);
contractDetail.setCredential_end_no(credentialEndNo);
acctComponent.saveGeneralContractDetail(contractDetail);
//如果支付方式不等于分期付款
if(!SystemConstants.PAY_TYPE_DELEYPAY.equals(payType)){
List<CGeneralCredential> generalCredentialList = new ArrayList<CGeneralCredential>();
if(null != credentialEndNo && credentialEndNo > 0){
for(int i=credentialStartNo;i<=credentialEndNo;i++){
CGeneralCredential generalCredential = new CGeneralCredential();
generalCredential.setContract_id(generalContract.getContract_id());
generalCredential.setCredential_no(contractNo+StringHelper.leftWithZero(i+"", 5));
generalCredential.setAmount(credentialAmount);
generalCredential.setBalance(credentialAmount);
generalCredential.setPercent(percent);
generalCredentialList.add(generalCredential);
}
}
acctComponent.saveGeneralCredentialList(generalCredentialList);
}
}
saveAllPublic(doneCode,getBusiParam());
}
/**
*
*/
public void savePayUnBusiFee(String contractId, int fee) throws Exception{
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
//保存合同付款信息
acctComponent.saveGeneralContractPay(doneCode,contractId,fee);
//更新合同已付金额
CGeneralContract generalContract = acctComponent.queryGeneralContractById(contractId);
generalContract.setPayed_amount(generalContract.getPayed_amount() + fee);
acctComponent.updateGeneralContract(generalContract);
CFee cFee = feeComponent.queryBySn(generalContract.getFee_sn());
//费用不需要打印
feeComponent.saveFeeUnitpre(SystemConstants.PAY_TYPE_CASH, cFee
.getFee_id(), cFee.getFee_type(), fee, doneCode, doneCode,
busiCode, SystemConstants.BOOLEAN_TRUE,null);
String contractNo = generalContract.getContract_no();
//获得凭据明细
CGeneralContractDetail generalContractDetail = acctComponent.queryGeneralContractDetailById(contractId);
if(null != generalContractDetail){
List<CGeneralCredential> generalCredentialList = new ArrayList<CGeneralCredential>();
//查询上次支付的最后一张凭据
CGeneralCredential lastGeneralCredential = acctComponent.queryLastCredential(contractId);
int percent = generalContractDetail.getPercent();
//凭据起始和截止号
Integer startNo = generalContractDetail.getCredential_start_no();
Integer endNo = generalContractDetail.getCredential_end_no();
//每张凭据金额
int amount = generalContractDetail.getCredential_amount();
//实际每张凭据现金
int cash = amount - amount * generalContractDetail.getPercent() / 100;
//需要插入的凭据张数
int num = 0;
//尚未插入凭据(即未支付)
if(null == lastGeneralCredential){
//本次付款能插入凭据张数
num = fee / cash;//整除的张数
num = num + (fee % cash == 0 ? 0 : 1);//如果fee不能能被cash整除,数量再加一,最后一张凭据金额由下次付款时补充
//如果比截止号大,取截止
num = (num+startNo-1) > endNo ? endNo : (num+startNo-1);
}else{
//根据最后一张凭据号,得到本次付款的第一张凭据号
String lastNoStr = lastGeneralCredential.getCredential_no();
int lastNo = Integer.valueOf(lastNoStr.substring(contractNo.length(), lastNoStr.length()));
startNo = lastNo + 1;
//如果最后一张凭据金额小于配置金额,补齐
if(lastGeneralCredential.getAmount() < amount){
//需要补齐的现金
int diffAmount = amount - lastGeneralCredential.getAmount();
int diffCash = diffAmount - diffAmount * percent / 100;
//更新凭据金额和剩余金额
lastGeneralCredential.setAmount(amount);
lastGeneralCredential.setBalance(diffAmount + lastGeneralCredential.getBalance());
acctComponent.updateGeneralCredential(lastGeneralCredential);
//实际剩余金额
fee = fee - diffCash;
}
num = fee / cash;//整除的张数
num = num + (fee % cash == 0 ? 0 : 1);//如果fee不能能被cash整除,数量再加一,最后一张凭据金额由下次付款时补充
//如果比截止号大,取截止
num = (num+startNo-1) > endNo ? (endNo-num-startNo) : (num+startNo-1);
}
for(int i=startNo;i<=num;i++){
if(i != num){
CGeneralCredential generalCredential = new CGeneralCredential();
generalCredential.setContract_id(generalContract.getContract_id());
generalCredential.setCredential_no(contractNo+StringHelper.leftWithZero(i+"", 5));
generalCredential.setAmount(amount);
generalCredential.setBalance(amount);
generalCredential.setPercent(percent);
generalCredentialList.add(generalCredential);
fee = fee -cash;
}else{
CGeneralCredential generalCredential = new CGeneralCredential();
generalCredential.setContract_id(generalContract.getContract_id());
generalCredential.setCredential_no(contractNo+StringHelper.leftWithZero(i+"", 5));
//最后一笔,按剩余现金折算
int lastAmount = 0;
if(percent == 0){
lastAmount = fee;//没赠送的时候
}else{
lastAmount = (fee * 100 / percent ) > amount ? amount : (fee * 100 / percent );
}
generalCredential.setAmount(lastAmount );
generalCredential.setBalance(lastAmount);
generalCredential.setPercent(percent);
generalCredentialList.add(generalCredential);
}
}
acctComponent.saveGeneralCredentialList(generalCredentialList);
}
saveAllPublic(doneCode,getBusiParam());
// saveDoneCode(doneCode, getBusiParam().getBusiCode(), null);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryGeneralContracts()
*/
public Pager<GeneralContractDto> queryGeneralContracts(Integer start, Integer limit, String query) throws Exception {
return acctComponent.queryGeneralContracts(start,limit,query);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#editGeneralContract(java.lang.String, java.lang.String, java.lang.Integer)
*/
public void editGeneralContract(CGeneralContract generalContract) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
//更新合同
acctComponent.updateGeneralContract(generalContract);
// saveAllPublic(doneCode,getBusiParam());
saveDoneCode(doneCode, getBusiParam().getBusiCode(), null);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#saveRemoveContract(java.lang.String)
*/
public void saveRemoveContract(String contractId) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
CGeneralContract contract = acctComponent.queryGeneralContractById(contractId);
acctComponent.removeContractWithHis(contract, doneCode);
CFee fee = feeComponent.queryBySn(contract.getFee_sn());
/*List<CFee> feeList = feeComponent.queryContractPay(contract.getContract_id());
feeList.add(fee);
for(CFee cFee : feeList){
cancelFee(doneCode, null, cFee);
}*/
if(fee != null){
feeComponent.saveCancelFee(fee, doneCode);
feeComponent.saveCancelPayFee(fee.getPay_sn(), doneCode);
}
saveAllPublic(doneCode,getBusiParam());
// saveDoneCode(doneCode, getBusiParam().getBusiCode(), null);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#saveRefundUnBusiFee(com.ycsoft.beans.core.acct.CGeneralContract)
*/
public void saveRefundUnBusiFee(CGeneralContract generalContract) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
CFee fee = feeComponent.saveFeeUnitpre(SystemConstants.PAY_TYPE_CASH,
generalContract.getFee_id(), generalContract.getFee_type(),
generalContract.getNominal_amount(), doneCode, doneCode,
busiCode, SystemConstants.BOOLEAN_FALSE,null);
String[] feeSns = {fee.getFee_sn()};
printComponent.saveDoc(feeComponent.queryAutoMergeFees(feeSns), null,
doneCode, getBusiParam().getBusiCode());
if(null != generalContract.getTotal_amount()){
generalContract.setTotal_amount(-generalContract.getTotal_amount());
}
generalContract.setPayed_amount(-generalContract.getPayed_amount());
generalContract.setFee_sn(fee.getFee_sn());
acctComponent.saveGeneralContract(generalContract);
//删除预收款凭据
acctComponent.removeGeneralCredentialByContractId(generalContract.getContract_id());
saveAllPublic(doneCode,getBusiParam());
// saveDoneCode(doneCode, getBusiParam().getBusiCode(), null);
}
/**
* 作废冻结金额
*/
public void clearInactiveAmount(String sn,String acctId, String acctItemId,int fee,int preFee) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String custId = getBusiParam().getCust().getCust_id();
String busiCode = getBusiParam().getBusiCode();
acctComponent.clearInactiveAmount(doneCode,sn, acctId, acctItemId,fee);
//记录作废金额异动
acctComponent.saveAcctitemChange(doneCode,
busiCode, custId, acctId,
acctItemId, SystemConstants.ACCT_CHANGE_INVALID,
SystemConstants.ACCT_FEETYPE_PRESENT, fee*-1,preFee, doneCode);
//创建销帐任务
jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE);
jobComponent.createAcctModeCalJob(doneCode, custId);
//修改产品对应的到期日
CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(acctId, acctItemId);
CProd prod = userProdComponent.queryByAcctItem(acctId, acctItemId);
userProdComponent.updateInvalidDate(doneCode, prod.getProd_sn(),0, fee*-1, acctItem);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode ,custId);
saveAllPublic(doneCode, getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryAllByAcctitemId(com.ycsoft.business.commons.pojo.BusiParameter, java.lang.String, java.lang.String)
*/
public List<CAcctAcctitemOrder> queryAllByAcctitemId(String acctId, String acctItemId) throws Exception {
return acctComponent.queryAllAcctitemOrder(acctId, acctItemId);
}
public List<CAcctAcctitemThresholdProp> queryAcctitemThresholdProp(
String acctId, String acctItemId) throws Exception {
return acctComponent.queryAcctitemThresholdProp(acctId, acctItemId);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryAllAcctitemOrder(java.lang.String, java.lang.String)
*/
public List<CAcctAcctitemOrder> queryAllAcctitemOrder(String acctId,
String acctItemId) throws Exception {
return acctComponent.queryAllAcctitemOrder(acctId, acctItemId);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryUnBusiFee()
*/
public List<TBusiFee> queryUnBusiFee() throws Exception {
return feeComponent.queryUnBusiFee();
}
public CBankPay queryBankPay(String banklogid) throws Exception {
return feeComponent.queryBankPayByLogId(banklogid);
}
public void saveBankPay(CBankPay bankPay) throws JDBCException {
feeComponent.saveBankPay(bankPay);
feeComponent.updateBankPayByDoneCode(bankPay.getDone_code());
}
public CAcctAcctitem queryAcctItemByAcctitemId(String acctId,String acctItemId) throws JDBCException {
return acctComponent.queryAcctItemByAcctitemId(acctId, acctItemId);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IAcctService#queryAcctitemInvalidByCustId(java.lang.String)
*/
public List<AcctAcctitemInvalidDto> queryAcctitemInvalidByCustId(String custId)
throws Exception {
return acctComponent.queryAcctitemInvalidByCustId(custId);
}
/**
* @param expressionUtil the expressionUtil to set
*/
public void setExpressionUtil(ExpressionUtil expressionUtil) {
this.expressionUtil = expressionUtil;
}
/**
* @param printComponent the printComponent to set
*/
public void setPrintComponent(PrintComponent printComponent) {
this.printComponent = printComponent;
}
/**
* 银行回盘处理
* 因为事物控制问题,分离了处理缴费和1301充值成功更新回盘标记的代码
* @return
*/
public void runBankReturn(BankReturnDto r,String errorinfo) throws Exception {
// 扣款回盘
if ("1301".equals(r.getBusi_type())
&& "0000".equals(r.getIs_success())) {
if(errorinfo!=null){
// 缴费失败更新回盘记录状态
CBankReturn cbr2 = new CBankReturn();
cbr2.setBank_trans_sn(r.getBank_trans_sn());
cbr2.setPay_status("FAILURE");
cbr2.setPay_failure_reason(errorinfo);
acctComponent.updateBankReturn(cbr2);
// 插入回盘错误记录
CBankReturnPayerror dest = new CBankReturnPayerror();
BeanUtils.copyProperties(r,dest);
dest.setPay_status("FAILURE");
dest.setPay_failure_reason(errorinfo);
dest.setBank_fee_name(r.getBank_fee_name());
dest.setCreate_time(null);
acctComponent.saveBankReturnPayerror(dest);
}
} else if("9301".equals(r.getBusi_type())
&& "0000".equals(r.getIs_success())){
CBankRefundtodisk cbf = acctComponent.findBankRefundtodisk(r.getTrans_sn());
if(cbf == null){
throw new IllegalArgumentException("交易流水号【"+ r.getTrans_sn() + "】,没有退款记录!");
}
String error_sn = cbf.getBank_trans_sn();
// 退款成功
if("0000".equals(r.getIs_success())){
// 更新状态
CBankReturn cbr2 = new CBankReturn();
cbr2.setBank_trans_sn(r.getBank_trans_sn());
cbr2.setPay_status("SUCCESS");
acctComponent.updateBankReturn(cbr2);
// 更新错误记录
CBankReturnPayerror dest = new CBankReturnPayerror();
dest.setBank_trans_sn(error_sn);
dest.setRefund_bank_sn(r.getBank_trans_sn());
dest.setRefund_status("SUCCESS");
acctComponent.updateBankReturnPayerror(dest); // UPDATE
}else{ // 退款失败
// 更新状态
CBankReturn cbr2 = new CBankReturn();
cbr2.setBank_trans_sn(r.getBank_trans_sn());
cbr2.setPay_status("INVALID");
acctComponent.updateBankReturn(cbr2);
// 更新错误记录
CBankReturnPayerror dest = new CBankReturnPayerror();
dest.setBank_trans_sn(error_sn);
dest.setRefund_bank_sn(r.getBank_trans_sn());
dest.setRefund_status("FAILURE");
acctComponent.updateBankReturnPayerror(dest); // UPDATE
}
}else {
CBankReturn cbr2 = new CBankReturn();
cbr2.setBank_trans_sn(r.getBank_trans_sn());
cbr2.setPay_status("INVALID");
acctComponent.updateBankReturn(cbr2);
}
}
public List<PPromFee> queryIsPromFee(String userId, String prodId) throws Exception {
return userComponent.queryIsPromFee(userId,prodId);
}
public void cancelFree(String acctId, String acctItemId, String prodSn,
int fee) throws Exception {
//获取客户信息
CCust cust = getBusiParam().getCust();
String busiCode = this.getBusiParam().getBusiCode();
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
CAcctAcctitem acctitem = acctComponent.queryAcctItemByAcctitemId(acctId, acctItemId);
if (acctitem!=null){//账目还存在
acctComponent.changeAcctItemBanlance(doneCode, busiCode, cust.getCust_id(),
acctitem.getAcct_id(), acctitem.getAcctitem_id(),
SystemConstants.ACCT_CHANGE_INVALID, SystemConstants.ACCT_FEETYPE_PRESENT, fee*-1, null);
//插入新的作废金额
this.acctComponent.createAcctitemInvalid(acctitem,cust.getCust_id(), doneCode, busiCode,SystemConstants.ACCT_FEETYPE_PRESENT,fee);
//修改产品对应的到期日
CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(acctId, acctItemId);
userProdComponent.updateInvalidDate(doneCode, prodSn,0, fee*-1, acctItem);
//生成计算到期日任务
jobComponent.createInvalidCalJob(doneCode ,cust.getCust_id());
} else {
//账目不存在
throw new ServicesException("账目已经被删除,无法作废");
}
saveAllPublic(doneCode,getBusiParam());
}
}