ZhiYeJianKang_PeiXun/Song.ServiceImpls/ProfitSharingCom.cs
2025-02-20 15:41:53 +08:00

442 lines
18 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using WeiSha.Common;
using Song.Entities;
using WeiSha.Data;
using Song.ServiceInterfaces;
using System.Data.Common;
namespace Song.ServiceImpls
{
public class ProfitSharingCom : IProfitSharing
{
#region
/// <summary>
/// 添加分润主题
/// </summary>
/// <param name="entity">业务实体</param>
public int ThemeAdd(ProfitSharing entity)
{
//添加对象,并设置排序号
object obj = Gateway.Default.Max<ProfitSharing>(ProfitSharing._.Ps_Level, ProfitSharing._.Ps_IsTheme == true);
int tax = obj is int ? (int)obj : 0;
entity.Ps_Level = tax + 1;
entity.Ps_IsTheme = true;
Gateway.Default.Save<ProfitSharing>(entity);
return entity.Ps_ID;
}
/// <summary>
/// 修改
/// </summary>
/// <param name="entity">业务实体</param>
public void ThemeSave(ProfitSharing entity)
{
Gateway.Default.Save<ProfitSharing>(entity);
}
/// <summary>
/// 当前分润方案
/// </summary>
/// <returns></returns>
public ProfitSharing ThemeCurrent()
{
Organization org = Business.Do<IOrganization>().OrganCurrent();
if (org == null) return null;
return ThemeCurrent(org.Org_ID);
}
/// <summary>
/// 机构的分润方案
/// </summary>
/// <param name="orgid">机构id</param>
/// <returns></returns>
public ProfitSharing ThemeCurrent(int orgid)
{
//课程所在机构
Organization org = Business.Do<IOrganization>().OrganSingle(orgid);
if (org == null) return null;
//所属机构等级
OrganLevel olevel = Business.Do<IOrganization>().LevelSingle(org.Olv_ID);
if (olevel == null) return null;
//分润方案
ProfitSharing psTheme = this.ThemeSingle(olevel.Ps_ID);
if (psTheme == null) return null; //如果没有设置分润方案
if (!psTheme.Ps_IsUse) return null; //如果分润方案没有启用
return psTheme;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="entity">业务实体</param>
public void ThemeDelete(ProfitSharing entity)
{
this.ThemeDelete(entity.Ps_ID);
}
/// <summary>
/// 删除按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
public void ThemeDelete(int identify)
{
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Delete<ProfitSharing>(ProfitSharing._.Ps_ID==identify);
tran.Delete<ProfitSharing>(ProfitSharing._.Ps_PID == identify);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
/// <summary>
/// 获取单一实体对象按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
/// <returns></returns>
public ProfitSharing ThemeSingle(int identify)
{
return Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_ID == identify).ToFirst<ProfitSharing>();
}
/// <summary>
/// 获取对象;即所有分类;
/// </summary>
/// <returns></returns>
public ProfitSharing[] ThemeAll(bool? isUse)
{
WhereClip wc = ProfitSharing._.Ps_IsTheme == true;
if (isUse != null) wc.And(ProfitSharing._.Ps_IsUse == (bool)isUse);
return Gateway.Default.From<ProfitSharing>().Where(wc).OrderBy(ProfitSharing._.Ps_Level.Asc).ToArray<ProfitSharing>();
}
/// <summary>
/// 将当前项目向上移动;
/// </summary>
/// <param name="id"></param>
/// <returns>如果已经处于顶端则返回false移动成功返回true</returns>
public bool ThemeRemoveUp(int id)
{
//当前对象
ProfitSharing current = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_ID == id).ToFirst<ProfitSharing>();
//当前对象排序号
int orderValue = (int)current.Ps_Level;
//上一个对象,即兄长对象;
ProfitSharing up = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_IsTheme == true && ProfitSharing._.Ps_Level < orderValue)
.OrderBy(ProfitSharing._.Ps_Level.Desc).ToFirst<ProfitSharing>();
//如果兄长对象不存在,则表示当前节点在兄弟中是老大;即是最顶点;
if (up == null) return false;
//交换排序号
current.Ps_Level = up.Ps_Level;
up.Ps_Level = orderValue;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Save<ProfitSharing>(current);
tran.Save<ProfitSharing>(up);
tran.Commit();
return true;
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
/// <summary>
/// 将当前项目向下移动;
/// </summary>
/// <param name="id"></param>
/// <returns>如果已经处于顶端则返回false移动成功返回true</returns>
public bool ThemeRemoveDown(int id)
{
//当前对象
ProfitSharing current = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_ID == id).ToFirst<ProfitSharing>();
//当前对象排序号
int orderValue = (int)current.Ps_Level;
//下一个对象,即弟弟对象;
ProfitSharing down = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_IsTheme == true && ProfitSharing._.Ps_Level > orderValue)
.OrderBy(ProfitSharing._.Ps_Level.Asc).ToFirst<ProfitSharing>();
//如果弟对象不存在,则表示当前节点在兄弟中是老幺;即是最底端;
if (down == null) return false;
//交换排序号
current.Ps_Level = down.Ps_Level;
down.Ps_Level = orderValue;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Save<ProfitSharing>(current);
tran.Save<ProfitSharing>(down);
tran.Commit();
return true;
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
#endregion
#region
/// <summary>
/// 添加分润项
/// </summary>
/// <param name="entity">业务实体</param>
public int ProfitAdd(ProfitSharing entity)
{
//添加对象,并设置排序号
object obj = Gateway.Default.Max<ProfitSharing>(ProfitSharing._.Ps_Level, ProfitSharing._.Ps_PID == entity.Ps_PID);
int tax = obj is int ? (int)obj : 0;
entity.Ps_Level = tax + 1;
entity.Ps_IsTheme = false;
//验证资金分润比例之合是否大于100
object objm = Gateway.Default.Sum<ProfitSharing>(ProfitSharing._.Ps_Moneyratio, ProfitSharing._.Ps_PID == entity.Ps_PID);
int summ = objm is int ? (int)objm : 0;
if ((summ + entity.Ps_Moneyratio) > 100) throw new Exception("资金分润比例之合不得大于100");
//验证卡券分润比例之合是否大于100
object objc = Gateway.Default.Sum<ProfitSharing>(ProfitSharing._.Ps_Moneyratio, ProfitSharing._.Ps_PID == entity.Ps_PID);
int sumc = objc is int ? (int)objc : 0;
if ((sumc + entity.Ps_Couponratio) > 100) throw new Exception("卡券分润比例之合不得大于100");
Gateway.Default.Save<ProfitSharing>(entity);
return entity.Ps_ID;
}
/// <summary>
/// 修改
/// </summary>
/// <param name="entity">业务实体</param>
public void ProfitSave(ProfitSharing entity)
{
//验证资金分润比例之合是否大于100
object objm = Gateway.Default.Sum<ProfitSharing>(ProfitSharing._.Ps_Moneyratio, ProfitSharing._.Ps_PID == entity.Ps_PID && ProfitSharing._.Ps_ID != entity.Ps_ID);
int summ = objm is int ? (int)objm : 0;
if ((summ + entity.Ps_Moneyratio) > 100) throw new Exception("资金分润比例之合不得大于100");
//验证卡券分润比例之合是否大于100
object objc= Gateway.Default.Sum<ProfitSharing>(ProfitSharing._.Ps_Moneyratio, ProfitSharing._.Ps_PID == entity.Ps_PID && ProfitSharing._.Ps_ID != entity.Ps_ID);
int sumc = objc is int ? (int)objc : 0;
if ((sumc + entity.Ps_Couponratio) > 100) throw new Exception("卡券分润比例之合不得大于100");
//保存
Gateway.Default.Save<ProfitSharing>(entity);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="entity">业务实体</param>
public void ProfitDelete(ProfitSharing entity)
{
Gateway.Default.Delete<ProfitSharing>(entity);
}
/// <summary>
/// 删除按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
public void ProfitDelete(int identify)
{
Gateway.Default.Delete<ProfitSharing>(ProfitSharing._.Ps_ID == identify);
}
/// <summary>
/// 获取单一实体对象按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
/// <returns></returns>
public ProfitSharing ProfitSingle(int identify)
{
return Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_ID == identify).ToFirst<ProfitSharing>();
}
/// <summary>
/// 获取对象;即所有分类;
/// </summary>
/// <param name="theme">方案主题的id</param>
/// <param name="isUse"></param>
/// <returns></returns>
public ProfitSharing[] ProfitAll(int theme, bool? isUse)
{
WhereClip wc = ProfitSharing._.Ps_IsTheme == false && ProfitSharing._.Ps_PID == theme;
if (isUse != null) wc.And(ProfitSharing._.Ps_IsUse == (bool)isUse);
return Gateway.Default.From<ProfitSharing>().Where(wc).OrderBy(ProfitSharing._.Ps_Level.Asc).ToArray<ProfitSharing>();
}
/// <summary>
/// 将当前项目向上移动;
/// </summary>
/// <param name="id"></param>
/// <returns>如果已经处于顶端则返回false移动成功返回true</returns>
public bool ProfitRemoveUp(int id)
{
//当前对象
ProfitSharing current = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_ID == id).ToFirst<ProfitSharing>();
//当前对象排序号
int orderValue = (int)current.Ps_Level;
//上一个对象,即兄长对象;
ProfitSharing up = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_PID == current.Ps_PID && ProfitSharing._.Ps_Level < orderValue)
.OrderBy(ProfitSharing._.Ps_Level.Desc).ToFirst<ProfitSharing>();
//如果兄长对象不存在,则表示当前节点在兄弟中是老大;即是最顶点;
if (up == null) return false;
//交换排序号
current.Ps_Level = up.Ps_Level;
up.Ps_Level = orderValue;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Save<ProfitSharing>(current);
tran.Save<ProfitSharing>(up);
tran.Commit();
return true;
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
/// <summary>
/// 将当前项目向下移动;
/// </summary>
/// <param name="id"></param>
/// <returns>如果已经处于顶端则返回false移动成功返回true</returns>
public bool ProfitRemoveDown(int id)
{
//当前对象
ProfitSharing current = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_ID == id).ToFirst<ProfitSharing>();
//当前对象排序号
int orderValue = (int)current.Ps_Level;
//下一个对象,即弟弟对象;
ProfitSharing down = Gateway.Default.From<ProfitSharing>().Where(ProfitSharing._.Ps_PID == current.Ps_PID && ProfitSharing._.Ps_Level > orderValue)
.OrderBy(ProfitSharing._.Ps_Level.Asc).ToFirst<ProfitSharing>();
//如果弟对象不存在,则表示当前节点在兄弟中是老幺;即是最底端;
if (down == null) return false;
//交换排序号
current.Ps_Level = down.Ps_Level;
down.Ps_Level = orderValue;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Save<ProfitSharing>(current);
tran.Save<ProfitSharing>(down);
tran.Commit();
return true;
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
#endregion
#region
/// <summary>
/// 计算分润
/// </summary>
/// <param name="couid">课程id,需要知道当前课程在哪个机构,哪个机构等级,从而获取分润方案</param>
/// <param name="money">消费的资金数</param>
/// <param name="coupon">消费的卡数</param>
/// <returns></returns>
public ProfitSharing[] Clac(int couid, double money, double coupon)
{
Course cou = Business.Do<ICourse>().CourseSingle(couid);
return Clac(cou, money, coupon);
}
public ProfitSharing[] Clac(Course cou, double money, double coupon)
{
if (cou == null) return null;
//分润方案
ProfitSharing psTheme = this.ThemeCurrent(cou.Org_ID);
if (psTheme == null) return null; //如果没有设置分润方案
if (!psTheme.Ps_IsUse) return null; //如果分润方案没有启用
ProfitSharing[] profits = this.ProfitAll(psTheme.Ps_ID, true);
if (profits.Length < 1) return null;
//计算
for (int i = 0; i < profits.Length; i++)
{
profits[i].Ps_MoneyValue = (decimal)profits[i].Ps_Moneyratio * ((decimal)money / 100);
profits[i].Ps_CouponValue = (int)Math.Floor(profits[i].Ps_Couponratio * ((double)coupon) / 100);
}
return profits;
}
/// <summary>
/// 分配利润
/// </summary>
/// <param name="cou">当前课程</param>
/// <param name="acc">当前学员账户</param>
/// <param name="money">消费的资金数</param>
/// <param name="coupon">消费的卡数</param>
public void Distribution(Course cou, Accounts acc, double money, double coupon)
{
Accounts[] parents = Business.Do<IAccounts>().Parents(acc);
if (parents.Length < 1) return;
//计算分润
ProfitSharing[] ps = this.Clac(cou, money, coupon);
if (ps == null) return;
int len = ps.Length > parents.Length ? parents.Length : ps.Length;
for (int i = 0; i < len; i++)
{
//写入资金分润
if (ps[i].Ps_MoneyValue > 0)
{
MoneyAccount ma = new MoneyAccount();
ma.Ma_Money = ps[i].Ps_MoneyValue;
ma.Ac_ID = parents[i].Ac_ID;
ma.Ma_Source = "分润";
ma.Ma_Info = string.Format("{0}{1})购买课程《{2}》,获取收益{3}", acc.Ac_Name, acc.Ac_AccName, cou.Cou_Name, ps[i].Ps_MoneyValue);
ma.Ma_From = 5; //
ma.Ma_IsSuccess = true;
ma.Org_ID = parents[i].Org_ID;
if (ma.Ma_Money > 0)
ma = Business.Do<IAccounts>().MoneyIncome(ma);
}
//写入卡券分润
if (ps[i].Ps_CouponValue > 0)
{
Song.Entities.CouponAccount ca = new CouponAccount();
ca.Ac_ID = parents[i].Ac_ID;
ca.Ca_Source = "分润";
ca.Ca_Value = ps[i].Ps_CouponValue;
ca.Ca_Total = parents[i].Ac_Coupon; //当前卡券总数
ca.Ca_Info = string.Format("{0}{1})购买课程《{2}》,获取收益{3}", acc.Ac_Name, acc.Ac_AccName, cou.Cou_Name, ps[i].Ps_CouponValue);
ca.Ca_From = 5;
if (ca.Ca_Value > 0) Business.Do<IAccounts>().CouponAdd(ca);
}
}
}
#endregion
}
}