这是第二篇package cn.yx56.cm
import java.time.LocalDate
import java.util.UUID
import cn.yx56.Share.utils.config.{DBUtil, DateUtil, OnlineResourceURL, PropDbPass, SparkInit}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
import cn.yx56.Share.utils.KuduTools.KuduHelper._
import cn.yx56.cm.MemberManageBaseInfo.{oracleProPw, oracleProUser}
import org.apache.spark.rdd.RDD
import scala.collection.mutable
/**
*
* @description: 计算会员积分(翻译后台代码)
* @author: wtl
* @create: 2020-05-22
**/
object MemberPointInfo extends OnlineResourceURL {
def main(args: Array[String]): Unit = {
val sparkSession: SparkSession = SparkInit.Init("local[*]", "memberPointInfo")
import sparkSession.implicits._
/*三天前的日期*/
val orderDate: String = DateUtil.getAddTime(LocalDate.now().toString, -3, "d")
val minorderDate: String = "2025-02-04"
println(orderDate)
/*会员表 会员卡号 当前积分 累计积分*/
val memberDf: DataFrame = sparkSession.readKuduTable("B_MEMBER_ODS")
.selectExpr("MEMBERCA01 MEMBER_CARD", "MEMBERCA13 CUR_POINT", "MEMBERCA17 TOTAL_POINT", "LAST_BP_BALANCE")
memberDf.createTempView("member_temp")
/*查询3天前签收的运单数据 避免受'反签收'业务的影响*/
val orderDf: Dataset[Row] = sparkSession.readKuduTable("T_ORDER_CTL_ODS")
.filter("SIGN_TIME>='" + orderDate + " 00:00:00' and SIGN_TIME<='" + orderDate + " 23:59:59' and ORDER_STATUS=3 and (SHIPPER_VIP_NUM is not null or CONSIGNEE_VIP_NUM is not null)")
.select("ORDER_ID", "SHIPPER_VIP_NUM", "CONSIGNEE_VIP_NUM")
orderDf.createTempView("order_temp")
/*运单费用表 只取运费数据 同样筛选出三天前的数据*/
val orderFeeDf: DataFrame = sparkSession.readKuduTable("T_ORDER_FEE_ODS")
.filter("FEE_TYPE=0")
.select("ORDER_ID", "PLAN_FEE", "PAY_SIDE")
orderFeeDf.createTempView("order_fee_temp")
/*运单支付表*/
sparkSession.readKuduTable("T_ORDER_PAY_ODS")
.filter("PAY_TYPE=3")
.select("ORDER_ID", "PAY_TYPE", "PAY_SIDE")
.createTempView("order_pay_temp")
/*区分发货人/收货人会员数据*/
val memberOrderDf: DataFrame = sparkSession.sql("select ORDER_ID,SHIPPER_VIP_NUM MEMBER_CARD,0 MEMBER_TYPE " +
"from order_temp " +
"where SHIPPER_VIP_NUM is not null " +
"union all " +
"select ORDER_ID,CONSIGNEE_VIP_NUM MEMBER_CARD,1 MEMBER_TYPE " +
"from order_temp " +
"where CONSIGNEE_VIP_NUM is not null")
memberOrderDf.createTempView("member_order_temp")
/*关联拿到运单费用以及支付方式 过滤掉发货会员合同付的数据(这种情况下不加积分)*/
val memberOrderFeeDf: DataFrame = sparkSession.sql("select t.*,f.PLAN_FEE PLAN_FEE,f.PAY_SIDE PAY_SIDE, " +
"m.CUR_POINT CUR_POINT,m.TOTAL_POINT TOTAL_POINT,m.LAST_BP_BALANCE LAST_BP_BALANCE,if(p.PAY_TYPE is null,-1,p.PAY_TYPE) PAY_TYPE " +
"from member_order_temp t join order_fee_temp f on t.order_id=f.order_id " +
"join member_temp m on t.MEMBER_CARD=m.MEMBER_CARD " +
"left join order_pay_temp p on t.order_id=p.order_id and f.PAY_SIDE=p.PAY_SIDE " +
"where !(MEMBER_TYPE=0 and f.PAY_SIDE=2)")
.filter(""" MEMBER_CARD = '0282834' """)
memberOrderFeeDf.show(40,false)
memberOrderFeeDf.printSchema()
// memberOrderFeeDf.createOrReplaceTempView("temp_a")
/* sparkSession.sql(" select * " +
"from temp_a " +
// "where MEMBER_CARD = 0152182 " +
" ").show()
*/
/**
* root
* |-- ORDER_ID: long (nullable = false) 0
* |-- MEMBER_CARD: string (nullable = true) 1
* |-- MEMBER_TYPE: integer (nullable = false) 2
* |-- PLAN_FEE: double (nullable = false) 3
* |-- PAY_SIDE: byte (nullable = false) 4
* |-- CUR_POINT: double (nullable = true) 5
* |-- TOTAL_POINT: double (nullable = true) 6
* |-- LAST_BP_BALANCE: double (nullable = false) 7
* |-- PAY_TYPE: integer (nullable = true) 8
*/
val resultRdd: RDD[String] = memberOrderFeeDf.rdd
.map(x => (x.getString(1), (x.getString(0), x.getInt(2), x.getDouble(3), x.getByte(4), x.getDouble(5), x.getDouble(6), x.getDouble(7), x.getInt(8))))
.groupByKey()
.flatMap(x => {
val sqlList: mutable.MutableList[String] = mutable.MutableList[String]()
//会员当前积分
var curPointUpdate: Double = 0.0
//会员累计积分
var totalPointUpdate: Double = 0.0
val list: List[(String, Int, Double, Byte, Double, Double, Double, Int)] = x._2.toList
for (i <- list) {
//运单ID
//
val orderId: String = i._1
//会员发货类型(0:发货,1:收货)
val memberType: Int = i._2
//运费
var fee: Double = i._3
//付款方(0:交付,1:提付,2:合同付)
val paySide: Byte = i._4
//会员当前积分
var curPoint: Double = i._5
//会员累计积分
var totalPoint: Double = i._6
//上年积分
val lastBpBalance: Double = i._7
//支付类型
val payType: Int = i._8
//运费积分
var feePoint: Double = 0
var payDesc: String = ""
//如果是发货会员
if (memberType == 0) {
//交付
if (paySide == 0) {
if (fee > 100) {
fee = (fee - 100) / 5 + 100
}
if (payType == 3) {
//如果运费大于500 最多只能加500积分
if (fee * 1.5 > 500) {
feePoint = 500
} else {
feePoint = fee * 1.5
}
} else {
//如果运费大于500 最多只能加500积分
if (fee > 500) {
feePoint = 500
} else {
feePoint = fee
}
}
payDesc = "交付,付款人"
} else {
//到付
//最多只能加100积分
if (fee / 5 > 100) {
feePoint = 100
} else {
feePoint = fee / 5
}
payDesc = "提付,非付款人"
}
} else {
//收货会员
//交付
if (paySide == 0) {
//最多只能加100积分
if (fee / 5 > 100) {
feePoint = 100
} else {
feePoint = fee / 5
}
payDesc = "交付,非付款人"
} else if (paySide == 1) {
if (fee > 100) {
fee = (fee - 100) / 5 + 100
}
//提付
if (payType == 3) {
//如果运费大于500 最多只能加500积分
if (fee * 1.5 > 500) {
feePoint = 500
} else {
feePoint = fee * 1.5
}
} else {
//如果运费大于500 最多只能加500积分
if (fee > 500) {
feePoint = 500
} else {
feePoint = fee
}
}
payDesc = "提付,付款人"
} else {
//合同付
//如果运费大于500 最多只能加500积分
if (fee / 5 > 100) {
feePoint = 100
} else {
feePoint = fee / 5
}
payDesc = "合同付,非付款人"
}
}
//取整
feePoint = Math.ceil(feePoint)
//获取昨天历史当前积分余额
if (curPointUpdate == 0.0) {
curPointUpdate = curPoint
curPointUpdate += feePoint
totalPointUpdate = totalPoint
totalPointUpdate += feePoint
} else {
curPointUpdate += feePoint
totalPointUpdate += feePoint
}
sqlList += "insert into B_MEMBER_BP_FLOW(ID,MEMBER_NO,VALUE,TYPE,REMARK,BALANCE,FLAG,LAST_BP_BALANCE,SERVICE_ID)values('" + UUID.randomUUID().toString + "','" + x._1 + "'," + feePoint + ",1,'" + payDesc + "'," + curPointUpdate + ",1," + lastBpBalance + ",'" + orderId + "')"
// sqlList += "insert into B_MEMBER_BP_FLOW(ID)values('" + UUID.randomUUID() + "')"
// println(sqlList)
// sqlList += "会员号 '"+ x._1 +"',付款方(0:交付,1:提付,2:合同付) '"+ paySide + "' , 注释 '"+ payDesc +"', '"+ orderId +"',会员当前积分 '"+ curPointUpdate +"',运费积分 '"+ feePoint +"',支付类型 '"+ payType +"',会员当前积分 '"+ curPoint +"',运费 '"+ fee +"',会员累计积分 '"+ totalPoint +"',会员发货类型 '"+memberType+"'"
}
sqlList += "update B_MEMBER set MEMBERCA13=" + curPointUpdate + ",MEMBERCA17=" + totalPointUpdate + " where MEMBERCA01='" + x._1 + "'"
sqlList
})
resultRdd.foreach(println(_))
// resultRdd.foreachPartition(x=>println(x))
// resultRdd.foreachPartition(x => DBUtil.sparkBatchSql(x.toList, 5000, oracleDriver, oracleProUrl, PropDbPass.getEncryptor().decrypt(oracleProUser), PropDbPass.getEncryptor().decrypt(oracleProPw)))
// resultRdd.foreachPartition(x => DBUtil.sparkBatchSql(x.toList, 5000, oracleDriver, oracleDwUrl,oracleDwDomeUser, oracleDwDuPw))
sparkSession.stop()
}
}
最新发布