int F847221(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	double 	tx_money = 0.0;
	char  ia_buf[1024]="";
	char sMsg[256]="";
	double	dUniNo = 0;
	T_t_tif_tradeserial serial;
	T_t_tif_tradeserial old_serial;
	T_t_group_cash_report group_cash;
	T_t_groups groups;
	InAcc IA;
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	int i;

	ResetNormalCPack(&aPack,0,1);

	if(strlen(rPack->scard0) <= 0)
	{
		*pRetCode = E_NOTEXIST_OPER;
		goto L_RETU;
	}
	ret = CheckOperatorPwd(rPack->scard0,rPack->semp_pwd);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}

	if(rPack->lvol1 <= 0)
	{
		*pRetCode = E_FAN_SERIAL_NOT_EXISTS;
		goto L_RETU;
	}

	// 更新被冲正流水的状态
	memset(&old_serial,0,sizeof old_serial);
	ret = DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(rPack->lvol1,&old_serial);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			*pRetCode = E_FAN_SERIAL_NOT_EXISTS;
		else
			*pRetCode = E_DB_TRADESERIAL_R;
		goto L_RETU;
	}

	if(SERISTAT_RUSH == old_serial.serial_state)
	{
		writelog(LOG_ERR,"流水已被冲正,流水号[%d]",old_serial.serial_no);
		*pRetCode = E_FAN_ALREADY_RUSHED;
		DB_t_tif_tradeserial_free_lock_cur();
		goto L_RETU;
	}

	old_serial.serial_state = SERISTAT_RUSH;
	ret = DB_t_tif_tradeserial_update_lock_by_cur(&old_serial);
	if(ret)
	{
		writelog(LOG_ERR,"更新流水[%d]状态失败",old_serial.serial_no);
		*pRetCode = E_DB_TRADESERIAL_U;
		goto L_RETU;
	}
	DB_t_tif_tradeserial_free_lock_cur();

	tx_money = old_serial.trade_fee;
	// 生成新的冲正流水
	ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniNo);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	// 查询组可解款余额
	memset(&group_cash,0,sizeof group_cash);
	ret = DB_t_group_cash_report_read_lock_by_c1_and_groupid(old_serial.showid,&group_cash);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			*pRetCode = E_FAN_ACC_NOT_EXISTS;
		else
			*pRetCode = E_DB_GRP_CASH_RPT_R;
		goto L_RETU;
	}
	
	/*
	if(amtcmp(tx_money,group_cash.cur_money)>0)
	{
		*pRetCode = E_FAN_ACC_INSUFFICIENT;
		DB_t_group_cash_report_free_lock_by_c1();
		goto L_RETU;
	}
	*/

	// 生成流水
	memset(&serial,0,sizeof serial);
	serial.serial_no = (int)dUniNo;
	serial.serial_state = SERISTAT_DEBT;
	serial.serial_type = TXCODE_FAN_RUSH_PAY;
	getsysdate(serial.operate_date);
	getsystime(serial.operate_time);
	des2src(serial.collect_date,serial.operate_date);
	des2src(serial.collect_time,serial.operate_time);
	GetLogicDate(serial.enteract_date);
	des2src(serial.enteract_time,serial.operate_time);

	des2src(serial.opercode,rPack->scard0);
	des2src(serial.reserve_1,rPack->scert_addr);
	serial.cardbefbal = tx_money;
	serial.trade_fee = tx_money * -1;
	// 商户号
	des2src(serial.showid,old_serial.showid);

	// 入账
	memset(&IA,0,sizeof IA);
	IA.dArrInAmt[0] = serial.trade_fee;
	IA.iCardNo = 0;
	//收费类别为 1
	IA.iFeeType = 1;
	IA.iTxFlag = ACC_TYPE_RUSH;
	IA.pVoidPointer = ia_buf;
	ret = process(&IA,&serial);
	if(ret)
	{
		writelog(LOG_ERR,"account process error [%d]",ret);
		*pRetCode  = ret;
		DB_t_group_cash_report_free_lock_by_c1();
		goto L_RETU;
	}
	SetCol(handle,0);
	SetCol(handle,F_VSMESS,F_LVOL1,F_DAMT1,F_DAMT2,F_SBANK_ACC,0);
	
	sprintf(out_pack->vsmess,"流水号:%d ",IA.iSerialNo);
	for(i=1;i<=IA.iOutTxTypeCnt;i++)
	{
		if(amtcmp(IA.dArrOutAmt[i],0)!=0)
		{
			sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
			strcat(out_pack->vsmess,sMsg);
		}
	}
	
	strcat(out_pack->vsmess,(char*)IA.pVoidPointer);
	writelog(LOG_DEBUG,out_pack->vsmess);

	des2src(group_cash.last_check_date,serial.operate_date);
	des2src(group_cash.last_check_time,serial.operate_time);
	group_cash.cur_money = group_cash.cur_money + tx_money;
	out_pack->lvol1 = serial.serial_no;
	out_pack->damt1 = serial.trade_fee;
	out_pack->damt2 = group_cash.cur_money;

	//更新组未解款金额
	ret = DB_t_group_cash_report_update_lock_by_c1(&group_cash);
	if(ret)
	{
		*pRetCode = E_DB_GRP_CASH_RPT_U;
		goto L_RETU;
	}
	// add
	DB_t_group_cash_report_free_lock_by_c1();
	ret = DB_t_groups_read_by_groupid(group_cash.groupid,&groups);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			*pRetCode = E_DB_GROUP_N;
		else
			*pRetCode = E_DB_GROUP_R;
		goto L_RETU;
	}
	des2src(out_pack->sbank_acc,groups.group_acc);
	//保存流水
	ret = DB_t_tif_tradeserial_add(&serial);
	if(ret)
	{
		if(DB_REPEAT == ret)
			return E_DB_TRADESERIAL_E;
		else
			return E_DB_TRADESERIAL_I;
		goto L_RETU;
	}
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
	
L_RETU:
	return -1;
}
Example #2
0
int F847220(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

    int ret=0;
    double 	tx_money = 0.0;
    char  ia_buf[1024]="";
    char sMsg[256]="";
    double	dUniNo = 0;
    T_t_tif_tradeserial serial;
    T_t_group_cash_report group_cash;
    int groupid;
    T_t_groups groups;
    InAcc IA;
    ST_CPACK aPack;
    ST_PACK *out_pack = &(aPack.pack);
    int i;

    ResetNormalCPack(&aPack,0,1);

    if(strlen(rPack->scard0) <= 0)
    {
        *pRetCode = E_NOTEXIST_OPER;
        goto L_RETU;
    }
    ret = CheckOperatorPwd(rPack->scard0,rPack->semp_pwd);
    if(ret)
    {
        writelog(LOG_ERR,"操作员密码错误operator[%s]",rPack->scard0);
        *pRetCode = ret;
        goto L_RETU;
    }

    if(strlen(rPack->sbank_acc) <= 0)
    {
        *pRetCode = E_NOTEXIST_ACCNO;
        goto L_RETU;
    }

    tx_money = rPack->damt1;
    if(amtcmp(tx_money,0.0)<=0)
    {
        *pRetCode = E_INPUT_AMT;
        goto L_RETU;
    }

    memset(&groups,0,sizeof groups);

    //ret = DB_t_groups_read_by_group_acc(rPack->sbank_acc,&groups);
    ret = DB_t_groups_read_by_groupid(rPack->sbank_acc,&groups);
    if(ret)
    {
        if(DB_NOTFOUND == ret)
            *pRetCode = E_NOTEXIST_ACCNO;
        else
            *pRetCode = E_DB_GROUP_R;
        goto L_RETU;
    }

    ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniNo);
    if(ret)
    {
        *pRetCode = ret;
        goto L_RETU;
    }

    // 查询组可解款余额
    memset(&group_cash,0,sizeof group_cash);
    ret = DB_t_group_cash_report_read_lock_by_c1_and_groupid(groups.groupid,&group_cash);
    if(ret)
    {
        if(DB_NOTFOUND == ret)
            *pRetCode = E_FAN_ACC_NOT_EXISTS;
        else
            *pRetCode = E_DB_GRP_CASH_RPT_R;
        goto L_RETU;
    }

    if(amtcmp(tx_money,group_cash.cur_money)>0)
    {
        writelog(LOG_ERR,"操作员组余额[%.2lf], 解款金额[%.2lf]",group_cash.cur_money,tx_money);
        *pRetCode = E_FAN_ACC_INSUFFICIENT;
        DB_t_group_cash_report_free_lock_by_c1();
        goto L_RETU;
    }

    // 生成流水
    memset(&serial,0,sizeof serial);
    serial.serial_no = D2I(dUniNo);
    serial.serial_state = SERISTAT_DEBT;
    serial.serial_type = TXCODE_FAN_PAY_MONEY;
    getsysdate(serial.operate_date);
    getsystime(serial.operate_time);
    des2src(serial.collect_date,serial.operate_date);
    des2src(serial.collect_time,serial.operate_time);
    GetLogicDate(serial.enteract_date);
    des2src(serial.enteract_time,serial.operate_time);

    des2src(serial.opercode,rPack->scard0);
    des2src(serial.reserve_1,rPack->scert_addr);
    serial.cardbefbal = tx_money;
    serial.trade_fee = tx_money;
    des2src(serial.showid,group_cash.groupid);

    // 入账
    memset(&IA,0,sizeof IA);
    //IA.dInCardBala = serial.cardbefbal;
    IA.dArrInAmt[0] = serial.trade_fee;
    IA.iCardNo = 0;
    //收费类别为 1
    IA.iFeeType = 1;
    IA.pVoidPointer = ia_buf;
    ret = process(&IA,&serial);
    if(ret)
    {
        writelog(LOG_ERR,"入账失败ret [%d]",ret);
        *pRetCode  = ret;
        DB_t_group_cash_report_free_lock_by_c1();
        goto L_RETU;
    }
    SetCol(handle,0);
    SetCol(handle,F_VSMESS,F_LVOL1,F_DAMT1,0);

    sprintf(out_pack->vsmess,"流水号:%d ",IA.iSerialNo);
    for(i=1; i<=IA.iOutTxTypeCnt; i++)
    {
        if(amtcmp(IA.dArrOutAmt[i],0)!=0)
        {
            sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
            strcat(out_pack->vsmess,sMsg);
        }
    }
    //serial.cardaftbal =
    strcat(out_pack->vsmess,(char*)IA.pVoidPointer);
    writelog(LOG_DEBUG,out_pack->vsmess);
    out_pack->lvol1 = serial.serial_no;
    group_cash.cur_money = group_cash.cur_money - serial.trade_fee;

    des2src(group_cash.last_check_date,serial.operate_date);
    des2src(group_cash.last_check_time,serial.operate_time);
    out_pack->damt1 = group_cash.cur_money;

    //更新组未解款金额
    ret = DB_t_group_cash_report_update_lock_by_c1(&group_cash);
    if(ret)
    {
        *pRetCode = E_DB_GRP_CASH_RPT_U;
        goto L_RETU;
    }
    // add
    DB_t_group_cash_report_free_lock_by_c1();
    //保存流水
    ret = DB_t_tif_tradeserial_add(&serial);
    if(ret)
    {
        if(DB_REPEAT == ret)
            return E_DB_TRADESERIAL_E;
        else
            return E_DB_TRADESERIAL_I;
        goto L_RETU;
    }
    PutRow(handle,out_pack,pRetCode,szMsg);
    return 0;
L_RETU:
    return -1;
}