Commit bad1fc86 by Joneq

修改分数动态获取

parents 6ed0d6ed 604a245b
...@@ -2,6 +2,7 @@ package main ...@@ -2,6 +2,7 @@ package main
import ( import (
"context" "context"
"encoding/json"
"flag" "flag"
"fmt" "fmt"
"github.com/bilibili/kratos/pkg/conf/paladin" "github.com/bilibili/kratos/pkg/conf/paladin"
...@@ -10,13 +11,16 @@ import ( ...@@ -10,13 +11,16 @@ import (
"kaopu-server/internal/service" "kaopu-server/internal/service"
"os" "os"
"strconv" "strconv"
"errors"
"github.com/ichunt2019/go-msgserver/utils/rabbitmq" "github.com/ichunt2019/go-msgserver/utils/rabbitmq"
"time" "time"
) )
type RecvPro struct {} type RecvPro struct {}
type RabbitMsg struct {
ComCreditsId string `json:"com_credits_id"`
ErpCompanyCode string `json:"erp_company_code"`
}
func main() { func main() {
//获取输入参数s //获取输入参数s
...@@ -26,47 +30,58 @@ func main() { ...@@ -26,47 +30,58 @@ func main() {
if err := paladin.Init(); err != nil { if err := paladin.Init(); err != nil {
panic(err) panic(err)
} }
model_dong := dao.Model_dong //所有动态模型算法列表
if mod == -1 { if mod == -1 {
queues() //队列监听 queues() //队列监听
} }
model_dong := dao.Model_dong //所有动态模型算法列表
_ ,ok := model_dong[mod] _ ,ok := model_dong[mod]
if !ok { if !ok {
fmt.Println("模块名称输入错误!") fmt.Println("模块名称输入错误!")
os.Exit(1) os.Exit(1)
} }
ctx := context.Background() //上下文
if mod == -1 { if mod == -1 {
queues() //队列监听 queues() //队列监听
} }
ctx := context.Background() //上下文
if mod >0 { if mod >0 {
svc := service.New() svc := service.New()
svc.DongRun(ctx,mod,""); //运行main svc.DongRun(ctx,mod,""); //运行main
svc.DongRun(ctx,999,""); //总计所有分数
logic.LogWrite("统计"+dao.Model_dong[mod]+"完成",dao.Model_dong_log[mod],1)
}else{ }else{
for {
logic.LogWrite("统计所有动态任务开始","_dong_main",1)
for k,_ := range model_dong{ for k,_ := range model_dong{
if k == -1 || k == 0 { if k == -1 || k == 0 {
continue; continue;
} }
mod_name := dao.Model_dong[k] mod_name := dao.Model_dong[k]
mod_name_log :=dao.Model_dong_log[k] mod_name_log :=dao.Model_dong_log[k]
fmt.Println("统计开始:"+strconv.Itoa(k)) logic.LogWrite("统计项目"+mod_name+"开始:"+strconv.Itoa(k),mod_name_log,1)
logic.Loginfo("统计开始--"+mod_name,mod_name_log);
svc := service.New()
svc.DongRun(ctx,k,""); //运行main
logic.LogWrite("统计项目"+mod_name+"结束:"+strconv.Itoa(k),mod_name_log,1)
}
svc := service.New() //最后关闭数据连接
svc.DongRun(ctx,mod,""); //运行main d := dao.New()
d.Close() //关闭数据库连接
fmt.Println("统计结束:"+strconv.Itoa(k)) time.Sleep(60*time.Second)
logic.Loginfo("统计结束--"+mod_name,mod_name_log);
} }
fmt.Println("\r\n所有任务已经完成") fmt.Println("\r\n所有任务已经完成")
} }
} }
//队列监听 //队列监听
...@@ -96,10 +111,36 @@ func queues() { ...@@ -96,10 +111,36 @@ func queues() {
//// 实现消费者 消费消息失败 自动进入延时尝试 尝试3次之后入库db //// 实现消费者 消费消息失败 自动进入延时尝试 尝试3次之后入库db
func (t *RecvPro) Consumer(dataByte []byte) error { func (t *RecvPro) Consumer(dataByte []byte) error {
//转成json串
var rbm RabbitMsg
json.Unmarshal(dataByte,&rbm)
fmt.Println(string(dataByte)) fmt.Print(rbm)
return errors.New("顶顶顶顶")
//return nil ctx := context.Background() //上下文
model_dong := dao.Model_dong //所有动态模型算法列表
for k,_ := range model_dong{
if k == -1 || k == 0 {
continue;
}
mod_name := dao.Model_dong[k]
mod_name_log :=dao.Model_dong_log[k]
fmt.Println("统计开始:"+strconv.Itoa(k))
logic.Loginfo("统计开始--"+mod_name,mod_name_log);
svc := service.New()
svc.DongRun(ctx,k,rbm.ErpCompanyCode); //运行main
fmt.Println("统计结束:"+strconv.Itoa(k))
logic.Loginfo("统计结束--"+mod_name,mod_name_log);
}
//最后关闭数据连接
d := dao.New()
d.Close() //关闭数据库连接
//return errors.New("顶顶顶顶")
return nil
} }
//消息已经消费3次 失败了 请进行处理 //消息已经消费3次 失败了 请进行处理
func (t *RecvPro) FailAction(dataByte []byte) error { func (t *RecvPro) FailAction(dataByte []byte) error {
......
...@@ -5,9 +5,9 @@ ...@@ -5,9 +5,9 @@
active = 20 active = 20
idle = 10 idle = 10
idleTimeout ="4h" idleTimeout ="4h"
queryTimeout = "1000ms" queryTimeout = "5s"
execTimeout = "1000ms" execTimeout = "5s"
tranTimeout = "1000ms" tranTimeout = "5s"
[Liexin_credit_source] [Liexin_credit_source]
addr = "192.168.2.232:3306" addr = "192.168.2.232:3306"
...@@ -16,6 +16,6 @@ ...@@ -16,6 +16,6 @@
active = 20 active = 20
idle = 10 idle = 10
idleTimeout ="4h" idleTimeout ="4h"
queryTimeout = "1000ms" queryTimeout = "5s"
execTimeout = "1000ms" execTimeout = "5s"
tranTimeout = "1000ms" tranTimeout = "5s"
\ No newline at end of file \ No newline at end of file
...@@ -69,7 +69,6 @@ func (d *dao) UpdateMoveSumScores(ctx context.Context,com_credits model.ComCredi ...@@ -69,7 +69,6 @@ func (d *dao) UpdateMoveSumScores(ctx context.Context,com_credits model.ComCredi
row.RowsAffected() row.RowsAffected()
return return
} }
......
...@@ -35,8 +35,12 @@ type ( ...@@ -35,8 +35,12 @@ type (
GetCompanyModelByProjectid(c context.Context, companyId int64) (r map[string]string, err error) GetCompanyModelByProjectid(c context.Context, companyId int64) (r map[string]string, err error)
GetModelTopsetByProjectId(c context.Context, companyId int64) (r map[string]string, err error) GetModelTopsetByProjectId(c context.Context, companyId int64) (r map[string]string, err error)
UpdateStaticSumScores(c context.Context,com_credits model.ComCredits) (resId int64, err error) UpdateStaticSumScores(c context.Context,com_credits model.ComCredits) (resId int64, err error)
<<<<<<< HEAD
GetCompanyModelItemsByProjectid(c context.Context, project_id int64 , score float64) (res map[string]string, err error) GetCompanyModelItemsByProjectid(c context.Context, project_id int64 , score float64) (res map[string]string, err error)
GetCompanyModelItemsByProjectidWitchString(c context.Context, project_id int64 , stringVal string) (res map[string]string, err error) GetCompanyModelItemsByProjectidWitchString(c context.Context, project_id int64 , stringVal string) (res map[string]string, err error)
=======
UpdateMoveSumScores(c context.Context,com_credits model.ComCredits) (resId int64, err error)
>>>>>>> 604a245ba1f6aa5be22837a9e9d0ce8ea80ddbfe
//---静态结束 //---静态结束
//---动态开始 //---动态开始
......
...@@ -49,31 +49,33 @@ var Model_dong_log = map[int]string{ ...@@ -49,31 +49,33 @@ var Model_dong_log = map[int]string{
//计算逾期金额率:延期支付时间超过平均账期的金额/收款总额: //计算逾期金额率:延期支付时间超过平均账期的金额/收款总额:
func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code string) (r []map[string]interface{},err error) { func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code string) (r []map[string]interface{},err error) {
var ( var (
weight float64 //权重
ladder_rate float64 //计算出来的各个动态分数率 ladder_rate float64 //计算出来的各个动态分数率
ladder_score float64 =0; //对应梯度分数 ladder_score float64 =0; //对应梯度分数
_sql2 string; // _sql2 string; //查询公司信息sql
mod_name string = Model_dong[project_id] //统计动态模型名称 mod_name string = Model_dong[project_id] //统计动态模型名称
log_pre string = Model_dong_log[project_id] //日志文件名称 log_pre string = Model_dong_log[project_id] //日志文件名称
modelItem map[string]string //配置主表
modelItems []map[string]string //配置明细
) )
//查询逾期率项目配置
sql_str1 := fmt.Sprintf(_sql1,strconv.Itoa(project_id)) if project_id != 999 && project_id != 0 {
yuqilv_project,err := d.QueryOne(ctx,1,sql_str1) //项目配置
if yuqilv_project == nil { sql_str1 := fmt.Sprintf(_sql1,strconv.Itoa(project_id))
log3 := "不存在该项目配置lie_model ,project_id:"+strconv.Itoa(project_id) modelItem,_ = d.QueryOne(ctx,1,sql_str1)
fmt.Print(log3) if modelItem == nil {
logic.Loginfo(log3,log_pre) logic.LogWrite("不存在该项目配置lie_model.project_id:"+strconv.Itoa(project_id),log_pre,1)
return return
} }
weight,_ := strconv.ParseFloat(yuqilv_project["weight"],64) weight,_ = strconv.ParseFloat(modelItem["weight"],64)
//查询逾期率项目详情 //查询逾期率项目详情
sql_str4 := fmt.Sprintf(_sql4,strconv.Itoa(project_id)) sql_str4 := fmt.Sprintf(_sql4,strconv.Itoa(project_id))
modelItems,err := d.QueryMany(ctx,1,sql_str4) modelItems,_ = d.QueryMany(ctx,1,sql_str4)
if modelItems == nil { if modelItems == nil {
log4 := "不存在该项目配置详情lie_model_items,project_id:"+strconv.Itoa(project_id) logic.LogWrite("不存在该项目配置详情lie_model_items,project_id:"+strconv.Itoa(project_id),log_pre,1)
logic.Loginfo(log4,log_pre) return
fmt.Print(log4) }
return
} }
//查询当前申请的所有公司 //查询当前申请的所有公司
...@@ -85,72 +87,68 @@ func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code strin ...@@ -85,72 +87,68 @@ func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code strin
company_info,err := d.QueryMany(ctx,1,_sql2); company_info,err := d.QueryMany(ctx,1,_sql2);
if err != nil { if err != nil {
fmt.Println("\r\nerror:1004",err.Error()) logic.LogWrite("错误"+err.Error(),log_pre,1)
logic.Loginfo("错误"+err.Error(),log_pre)
return return
} }
for _,v := range company_info{ //循环当前公司,计算各个公司对应分数 for _,v := range company_info{ //循环当前公司,计算各个公司对应分数
if v["erp_company_code"] != "" { if v["erp_company_code"] == "" {
//调用公共动态算法去查对应得分 continue;
switch project_id{ }
case 35: //逾期金额率 //调用公共动态算法去查对应得分
ladder_rate,ladder_score,_ = d.DongYuqiRate(ctx,v,modelItems,project_id) switch project_id{
case 36: //发生逾期笔数率 case 35: //逾期金额率
ladder_rate,ladder_score,_ = d.DongYuqiBi(ctx,v,modelItems,project_id) ladder_rate,ladder_score,_ = d.DongYuqiRate(ctx,v,modelItems,project_id)
case 37: //平均逾期支付时间 case 36: //发生逾期笔数率
ladder_rate,ladder_score,_ = d.DongYuqiDivDay(ctx,v,modelItems,project_id) ladder_rate,ladder_score,_ = d.DongYuqiBi(ctx,v,modelItems,project_id)
case 38: //平均付款时间 case 37: //平均逾期支付时间
ladder_rate,ladder_score,_ = d.DongDivPayDay(ctx,v,modelItems,project_id) ladder_rate,ladder_score,_ = d.DongYuqiDivDay(ctx,v,modelItems,project_id)
case 39: //正常收款金额率 case 38: //平均付款时间
ladder_rate,ladder_score,_ = d.DongNormalPayRate(ctx,v,modelItems,project_id) ladder_rate,ladder_score,_ = d.DongDivPayDay(ctx,v,modelItems,project_id)
case 40: //正常收款笔数率 case 39: //正常收款金额率
ladder_rate,ladder_score,_ = d.DongNormalPayBi(ctx,v,modelItems,project_id) ladder_rate,ladder_score,_ = d.DongNormalPayRate(ctx,v,modelItems,project_id)
case 42: //交货及时率 case 40: //正常收款笔数率
ladder_rate,ladder_score,_ = d.DongInTimeRate(ctx,v,modelItems,project_id) ladder_rate,ladder_score,_ = d.DongNormalPayBi(ctx,v,modelItems,project_id)
case 43: //退货率 case 42: //交货及时率
ladder_rate,ladder_score,_ = d.DongReturnRate(ctx,v,modelItems,project_id) ladder_rate,ladder_score,_ = d.DongInTimeRate(ctx,v,modelItems,project_id)
case 999: case 43: //退货率
d.DongAddScore(ctx,logic.MyInt64(v["id"])) //总计所有分数 ladder_rate,ladder_score,_ = d.DongReturnRate(ctx,v,modelItems,project_id)
continue; case 999:
default: d.DongAddScore(ctx,logic.MyInt64(v["id"])) //总计所有分数
continue; continue
} default:
continue;
if ladder_score == 0 { }
log1 := "统计"+mod_name+"--跳过,没有分数,公司编码:"+v["erp_company_code"]+" 计算率:"+logic.MyFloat64ToStr(ladder_rate)+"\r\n"
fmt.Print(log1) if ladder_score == 0 {
logic.Loginfo(log1,log_pre) logic.LogWrite("统计"+mod_name+"--没有梯度对应分数,公司编码:"+v["erp_company_code"]+" 计算率:"+logic.MyFloat64ToStr(ladder_rate),log_pre,1)
continue; continue;
} }
//计算得到的分数插入分数明细表 //计算得到的分数插入分数明细表
var scores model.Scores //插入分数结构体 var scores model.Scores //插入分数结构体
scores.Type=2; ProjectPid := logic.MyInt8(modelItem["pid"])
scores.ProjectPid = logic.MyInt8(yuqilv_project["pid"]); ProjectId := logic.MyInt8(modelItem["id"])
scores.ProjectId = logic.MyInt8(yuqilv_project["id"]);
scores.TotalScore = ladder_score; scores.Type=2;
scores.CurrentScore = ladder_score; scores.ProjectPid = ProjectPid;
scores.Weight= weight; scores.ProjectId = ProjectId;
scores.FinalScore = weight*ladder_score; //权重乘以单位 scores.TotalScore = ladder_score;
scores.ComCreditsId = logic.MyInt64(v["id"]); scores.CurrentScore = ladder_score;
scores.Weight= weight;
//d := New() scores.FinalScore = weight*ladder_score; //权重乘以单位
insertid,err := d.InsertScores(ctx,scores) scores.ComCreditsId = logic.MyInt64(v["id"]);
if err != nil {
logic.Loginfo("错误:"+err.Error(),log_pre) //fmt.Print(scores)
fmt.Print("错误:"+err.Error(),insertid,ladder_rate) //d := New()
} insertid,err := d.InsertScores(ctx,scores)
if err != nil {
log2 := "统计"+mod_name+"--成功,公司编码:"+v["erp_company_code"]+" 计算得分:"+logic.MyFloat64ToStr(ladder_score)+" 最终得分:"+logic.MyFloat64ToStr(weight*ladder_score); logic.Loginfo("错误:"+err.Error(),log_pre)
fmt.Print(log2) fmt.Print("错误:"+err.Error(),insertid,ladder_rate)
logic.Loginfo(log2,log_pre)
} }
fmt.Print("XIE:"+v["erp_company_code"]) //日志
logic.LogWrite("统计"+mod_name+"--成功,公司编码:"+v["erp_company_code"]+" 计算得分:"+logic.MyFloat64ToStr(ladder_score)+" 权重:"+logic.MyFloat64ToStr(weight)+" 最终得分:"+logic.MyFloat64ToStr(weight*ladder_score),log_pre,1)
} }
//d.Close(); //关闭数据库连接
logic.Loginfo("统计"+mod_name+"完成",log_pre)
return return
} }
......
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"kaopu-server/internal/logic" "kaopu-server/internal/logic"
"kaopu-server/internal/model"
"strconv" "strconv"
) )
...@@ -20,7 +21,7 @@ const ( ...@@ -20,7 +21,7 @@ const (
_sql13 = "select abs(sum(return_amount)) sum_tuihuo from lie_basic_detail where return_amount<0 and erp_company_code='%s'" //退货总金额 下单时间在1/1-1/30且下单金额为负数的金额合计 _sql13 = "select abs(sum(return_amount)) sum_tuihuo from lie_basic_detail where return_amount<0 and erp_company_code='%s'" //退货总金额 下单时间在1/1-1/30且下单金额为负数的金额合计
_sql14 = "select sum(order_amount) sum_chuhuo from lie_basic_detail where order_amount>0 and erp_company_code='%s'" //出货总金额 下单时间在1/1-1/30的下单总金额合计 _sql14 = "select sum(order_amount) sum_chuhuo from lie_basic_detail where order_amount>0 and erp_company_code='%s'" //出货总金额 下单时间在1/1-1/30的下单总金额合计
_sql15 = "select sum(return_amount) sum_shou from lie_basic_detail where return_amount>0 and erp_company_code='%s'" //收款总额 应收日期在1/1-1/31的回款金额 下单时间在1/1-1/30的下单总金额合计 _sql15 = "select sum(return_amount) sum_shou from lie_basic_detail where return_amount>0 and erp_company_code='%s'" //收款总额 应收日期在1/1-1/31的回款金额 下单时间在1/1-1/30的下单总金额合计
_sql16 = "select sum(final_score) sum_dong_score from lie_scores where type=2 and com_credits_id=%s"; //总计动态信用分 _sql16 = "select sum(final_score) sum_dong_score from lie_scores where type=2 and com_credits_id=%d"; //总计动态信用分
) )
/* /*
...@@ -74,6 +75,7 @@ func (d *dao) DongYuqiBi(ctx context.Context,y map[string]string,modelItems []ma ...@@ -74,6 +75,7 @@ func (d *dao) DongYuqiBi(ctx context.Context,y map[string]string,modelItems []ma
score_one = logic.MyFloat64(y["score"]) //得到的分数 score_one = logic.MyFloat64(y["score"]) //得到的分数
} }
} }
//fmt.Print(modelItems,birate,score_one)
ladder_rate = birate ladder_rate = birate
ladder_score = score_one ladder_score = score_one
...@@ -86,13 +88,13 @@ func (d *dao) DongYuqiDivDay(ctx context.Context,y map[string]string,modelItems ...@@ -86,13 +88,13 @@ func (d *dao) DongYuqiDivDay(ctx context.Context,y map[string]string,modelItems
score_one float64 =0; //分数 score_one float64 =0; //分数
) )
//每笔逾期账款的逾期时间合计 //每笔逾期账款的逾期时间合计
yuqibi,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql8,y["erp_company_code"])) c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql8,y["erp_company_code"]))
if yuqibi["sum_delay_day"] == "0" { //没有结果 if c1["sum_delay_day"] == "0" { //没有结果
return return
} }
//发生逾期总笔数 //发生逾期总笔数
allbi,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql5,y["erp_company_code"])) c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql5,y["erp_company_code"]))
rate_res := logic.MyFloat64(yuqibi["sum_delay_day"])/logic.MyFloat64(allbi["allbi"]) rate_res := logic.MyFloat64(c1["sum_delay_day"])/logic.MyFloat64(c2["yuqibi"])
//计算分数 //计算分数
for _,y := range modelItems{ for _,y := range modelItems{
...@@ -307,24 +309,24 @@ func (d *dao) DongReturnRate(ctx context.Context,y map[string]string,modelItems ...@@ -307,24 +309,24 @@ func (d *dao) DongReturnRate(ctx context.Context,y map[string]string,modelItems
func (d *dao) DongAddScore(ctx context.Context,com_credits_id int64)(affectNum int64) { func (d *dao) DongAddScore(ctx context.Context,com_credits_id int64)(affectNum int64) {
var( var(
execSql string
sum_dong_score float64 //动态模型总分 sum_dong_score float64 //动态模型总分
) )
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql16,com_credits_id)) c1,_ := d.QueryOne(ctx,1,fmt.Sprintf(_sql16,com_credits_id))
if c1["sum_dong_score"] == "0" || c1["sum_dong_score"] == "" { //没有结果 if c1["sum_dong_score"] == "0" || c1["sum_dong_score"] == "" { //没有结果
sum_dong_score = 0 sum_dong_score = 0
}else{ }else{
sum_dong_score = logic.MyFloat64(c1["sum_dong_score"]) sum_dong_score = logic.MyFloat64(c1["sum_dong_score"])
} }
execSql = "update `lie_com_credits` set `dynamic_credit_score` = ? where id = ? " var com_credit model.ComCredits
row,err := d.db.Exec(ctx,execSql,sum_dong_score,com_credits_id) com_credit.DynamicCreditScore = sum_dong_score
if err != nil { com_credit.Id = com_credits_id
logic.Loginfo("更新动态总分出错"+err.Error(),"sum_dong")
} logic.LogWrite("统计动态分数完成,供应商id:"+logic.MyInt64ToStr(com_credits_id)+"总动态分:"+logic.MyFloat64ToStr(sum_dong_score),"dong_sum",1)
affectNum,_ = row.RowsAffected() //最后累计总分评分
//defer d.db.Close() 不能函数里面关闭数据库连接 affectNum,_ = d.UpdateMoveSumScores(ctx,com_credit)
return return
} }
......
...@@ -16,6 +16,8 @@ func (d *dao) InsertScores(ctx context.Context,score model.Scores) (insertId int ...@@ -16,6 +16,8 @@ func (d *dao) InsertScores(ctx context.Context,score model.Scores) (insertId int
execSql string execSql string
affectNum int64 affectNum int64
) )
//ss := fmt.Sprintf("select id from lie_scores where `type` = %d and project_pid = %d and project_id = %d and com_credits_id = %d limit 0,1", score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId)
//print(ss)
err = d.db.QueryRow(ctx,"select id from lie_scores where `type` = ? and project_pid = ? and project_id = ? and com_credits_id = ? limit 0,1", score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId).Scan(&exitId) err = d.db.QueryRow(ctx,"select id from lie_scores where `type` = ? and project_pid = ? and project_id = ? and com_credits_id = ? limit 0,1", score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId).Scan(&exitId)
if err != nil { if err != nil {
fmt.Print(err) fmt.Print(err)
......
package logic package logic
import ( import (
"fmt"
"io" "io"
"os" "os"
"time" "time"
...@@ -44,6 +45,15 @@ func Loginfo(writeString string,log_file_pre string) { ...@@ -44,6 +45,15 @@ func Loginfo(writeString string,log_file_pre string) {
io.WriteString(f,"\r\n"+date2+"----"+ss) //写入文件(字符串) io.WriteString(f,"\r\n"+date2+"----"+ss) //写入文件(字符串)
//fmt.Print(err) //fmt.Print(err)
} }
/*
打印并且记录日志
*/
func LogWrite(log1 string,log_pre string,is_write int) {
if is_write == 1 {
fmt.Print(log1+"\r\n")
}
Loginfo(log1,log_pre)
}
/** /**
from: http://www.isharey.com/?p=143 from: http://www.isharey.com/?p=143
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment