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

633 lines
28 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 System.Linq;
using WeiSha.Common;
using Song.Entities;
using WeiSha.Data;
using Song.ServiceInterfaces;
using System.IO;
namespace Song.ServiceImpls
{
public class OrganizationCom : IOrganization
{
public void OrganAdd(Organization entity)
{
entity.Org_RegTime = DateTime.Now;
entity.Org_IsRoot = false;
entity.Org_IsPass = false;
//所属机构等级
Song.Entities.OrganLevel lv;
if (entity.Olv_ID > 0)
{
lv = Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_ID == entity.Olv_ID).ToFirst<OrganLevel>();
entity.Olv_Name = lv.Olv_Name;
}
else
{
lv = Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_IsDefault == true).ToFirst<OrganLevel>();
entity.Olv_ID = lv.Olv_ID;
entity.Olv_Name = lv.Olv_Name;
}
//解析地址
WeiSha.Common.Param.Method.Position posi = WeiSha.Common.Request.Position(entity.Org_Longitude, entity.Org_Latitude);
entity.Org_Province = posi.Province;
entity.Org_City = posi.City;
entity.Org_District = posi.District;
entity.Org_Street = posi.Street;
//
Gateway.Default.Save<Organization>(entity);
this.OrganBuildCache(); //重新构建缓存
}
/// <summary>
/// 修改机构信息
/// </summary>
/// <param name="entity">业务实体</param>
public void OrganSave(Organization entity)
{
if (entity.Org_ID < 1) return;
//解析地址
WeiSha.Common.Param.Method.Position posi = WeiSha.Common.Request.Position(entity.Org_Longitude, entity.Org_Latitude);
entity.Org_Province = posi.Province;
entity.Org_City = posi.City;
entity.Org_District = posi.District;
entity.Org_Street = posi.Street;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Save<Organization>(entity);
//员工所属机构名称
tran.Update<EmpAccount>(new Field[] { EmpAccount._.Org_Name }, new object[] { entity.Org_Name }, EmpAccount._.Org_ID == entity.Org_ID);
tran.Update<Depart>(new Field[] { Depart._.Org_Name }, new object[] { entity.Org_Name }, Depart._.Org_ID == entity.Org_ID);
//专业、课程、试卷,考试
tran.Update<Subject>(new Field[] { Subject._.Org_Name }, new object[] { entity.Org_Name }, Subject._.Org_ID == entity.Org_ID);
tran.Update<Course>(new Field[] { Course._.Org_Name }, new object[] { entity.Org_Name }, Course._.Org_ID == entity.Org_ID);
tran.Update<TestPaper>(new Field[] { TestPaper._.Org_Name }, new object[] { entity.Org_Name }, TestPaper._.Org_ID == entity.Org_ID);
tran.Update<Examination>(new Field[] { Examination._.Org_Name }, new object[] { entity.Org_Name }, Examination._.Org_ID == entity.Org_ID);
//学员与教师
tran.Update<StudentSort>(new Field[] { StudentSort._.Org_Name }, new object[] { entity.Org_Name }, StudentSort._.Org_ID == entity.Org_ID);
tran.Update<Teacher>(new Field[] { Teacher._.Org_Name }, new object[] { entity.Org_Name }, Teacher._.Org_ID == entity.Org_ID);
tran.Update<TeacherSort>(new Field[] { TeacherSort._.Org_Name }, new object[] { entity.Org_Name }, TeacherSort._.Org_ID == entity.Org_ID);
tran.Commit();
this.OrganBuildCache();
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
this.OrganBuildQrCode(entity);
this.OrganBuildCache(); //重新构建缓存
}
public void OrganSetDefault(int identify)
{
using (DbTrans trans = Gateway.Default.BeginTrans())
{
try
{
trans.Update<Organization>(new Field[] { Organization._.Org_IsDefault },
new object[] { true }, Organization._.Org_ID == identify);
trans.Update<Organization>(new Field[] { Organization._.Org_IsDefault },
new object[] { false }, Organization._.Org_ID != identify);
trans.Commit();
this.OrganBuildCache();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
finally
{
trans.Close();
}
}
this.OrganBuildCache(); //重新构建缓存
}
/// <summary>
/// 系统默认采用的机构不是Root机构)
/// </summary>
/// <returns></returns>
public Organization OrganDefault()
{
//当前机构
Organization curr = null;
//从缓存中读取
List<Organization> list = WeiSha.Common.Cache<Organization>.Data.List;
if (list == null || list.Count < 1) list = this.OrganBuildCache();
List<Organization> tm = (from l in list
where l.Org_IsUse == true && l.Org_IsPass == true && l.Org_IsShow == true && l.Org_IsDefault == true
select l).ToList<Organization>();
if (tm.Count > 0) curr = tm[0];
//如果缓存中没有,则读取数据库
if (curr == null)
{
WhereClip wc = new WhereClip();
wc &= Organization._.Org_IsUse == true;
wc &= Organization._.Org_IsPass == true;
wc &= Organization._.Org_IsShow == true;
curr = Gateway.Default.From<Organization>().Where(wc && Organization._.Org_IsDefault == true).ToFirst<Organization>();
}
return curr == null ? this.OrganRoot() : curr;
}
/// <summary>
/// 用于系统管理的机构即Root机构)
/// </summary>
/// <returns></returns>
public Organization OrganRoot()
{
//当前机构
Organization curr = null;
//从缓存中读取
List<Organization> list = WeiSha.Common.Cache<Organization>.Data.List;
if (list == null || list.Count < 1) list = this.OrganBuildCache();
List<Organization> tm = (from l in list
where l.Org_IsRoot == true
select l).ToList<Organization>();
if (tm.Count > 0) curr = tm[0];
//如果缓存中没有,则读取数据库
if (curr == null)
{
curr = Gateway.Default.From<Organization>().Where(Organization._.Org_IsRoot == true).ToFirst<Organization>();
if (curr == null) curr = Gateway.Default.From<Organization>().ToFirst<Organization>();
}
return curr;
}
/// <summary>
/// 当前机构
/// </summary>
/// <returns></returns>
public Organization OrganCurrent()
{
//当前机构
Organization curr = null;
WhereClip wc = new WhereClip();
wc &= Organization._.Org_IsUse == true;
wc &= Organization._.Org_IsPass == true;
wc &= Organization._.Org_IsShow == true;
List<Organization> list = WeiSha.Common.Cache<Organization>.Data.List;
if (list == null || list.Count < 1) list = this.OrganBuildCache();
//是否启用多机构0为多机构1为单机构
int multi = Business.Do<ISystemPara>()["MultiOrgan"].Int32 ?? 0;
if (multi == 1)
{
List<Organization> tm = (from l in list
where l.Org_IsUse == true && l.Org_IsPass == true && l.Org_IsShow == true && l.Org_IsDefault == true
select l).ToList<Organization>();
if (tm.Count > 0) curr = tm[0];
//如果缓存中没有,则读取数据库
if (curr == null) curr = Gateway.Default.From<Organization>().Where(wc && Organization._.Org_IsDefault == true).ToFirst<Organization>();
}
else
{
//当前机构的二级域名
string twoDomain = WeiSha.Common.Request.Domain.TwoDomain;
List<Organization> tm = (from l in list
where l.Org_IsUse == true && l.Org_IsPass == true && l.Org_IsShow == true && l.Org_TwoDomain == twoDomain
select l).ToList<Organization>();
if (tm.Count > 0) curr = tm[0];
//如果缓存中没有,则读取数据库
if (curr == null) curr = Gateway.Default.From<Organization>().Where(wc && Organization._.Org_TwoDomain == twoDomain).ToFirst<Organization>();
if (curr == null) curr = this.OrganDefault();
}
return curr;
}
public Organization OrganSingle(int identify)
{
//当前机构
Organization curr = null;
//从缓存中读取
List<Organization> list = WeiSha.Common.Cache<Organization>.Data.List;
if (list == null || list.Count < 1) list = this.OrganBuildCache();
List<Organization> tm = (from l in list
where l.Org_ID == identify
select l).ToList<Organization>();
if (tm.Count > 0) curr = tm[0];
if (curr == null) curr = Gateway.Default.From<Organization>().Where(Organization._.Org_ID == identify).ToFirst<Organization>();
return curr;
}
public void OrganDelete(int identify)
{
Organization org = this.OrganSingle(identify);
if (org.Org_IsRoot) return;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Delete<Organization>(Organization._.Org_ID == identify);
//删除机构下属组织
tran.Delete<Depart>(Depart._.Org_ID == identify);
tran.Delete<Team>(Team._.Org_ID == identify);
tran.Delete<EmpAccount>(EmpAccount._.Org_ID == identify);
tran.Delete<EmpGroup>(EmpGroup._.Org_ID == identify);
tran.Delete<EmpTitle>(EmpTitle._.Org_ID == identify);
//删除专业
tran.Delete<Subject>(Subject._.Org_ID == identify);
//删除教师与学生
tran.Delete<Teacher>(Teacher._.Org_ID == identify);
//tran.Delete<TeacherHistory>(TeacherHistory._.Org_ID == identify);
tran.Delete<TeacherSort>(TeacherSort._.Org_ID == identify);
tran.Delete<Accounts>(Accounts._.Org_ID == identify);
tran.Delete<StudentSort>(StudentSort._.Org_ID == identify);
//删除课程
tran.Delete<Course>(Course._.Org_ID == identify);
tran.Delete<Student_Course>(Student_Course._.Org_ID == identify);
//删除试题、试卷、考试、成绩
tran.Delete<Questions>(Questions._.Org_ID == identify);
//tran.Delete<Student_Ques>(Student_Ques._.Org_ID == identify);
tran.Delete<TestPaper>(TestPaper._.Org_ID == identify);
tran.Delete<Examination>(Examination._.Org_ID == identify);
//tran.Delete<ExamResults>(ExamResults._.Org_ID == identify);
//删除知识库
tran.Delete<KnowledgeSort>(KnowledgeSort._.Org_ID == identify);
tran.Delete<Knowledge>(Knowledge._.Org_ID == identify);
//删除新闻、通知
tran.Delete<Columns>(Columns._.Org_ID == identify);
tran.Delete<Article>(Article._.Org_ID == identify);
tran.Delete<Notice>(Notice._.Org_ID == identify);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
this.OrganBuildCache(); //重新构建缓存
}
public void OrganBuildQrCode()
{
this.OrganBuildCache(); //重新构建缓存
//批量生成二维码
List<Organization> orgs = WeiSha.Common.Cache<Organization>.Data.List;
if (orgs != null)
{
for (int i = 0; i < orgs.Count; i++)
{
OrganBuildQrCode(orgs[i]);
}
}
}
/// <summary>
/// 生成当前机构的手机端二维码
/// </summary>
/// <param name="entity"></param>
public void OrganBuildQrCode(Organization entity)
{
//如果没有二级域名,则直接退出
if (string.IsNullOrWhiteSpace(entity.Org_TwoDomain)) return;
//二维码的Url路径
string url = entity.Org_QrCodeUrl;
if (string.IsNullOrWhiteSpace(url))
{
string domain = WeiSha.Common.Server.MainName;
string port = WeiSha.Common.Server.Port;
url = "http://" + entity.Org_TwoDomain + "." + domain + ":" + port + "/Mobile/default.ashx";
}
//各项配置
WeiSha.Common.CustomConfig config = CustomConfig.Load(entity.Org_Config); //自定义配置项
string color = config["QrColor"].Value.String; //二维码前景色
bool isQrcenter = config["IsQrConterImage"].Value.Boolean ?? false; //是否启用中心图片
string centerImg = Upload.Get["Org"].Virtual + config["QrConterImage"].Value.String; //中心图片
centerImg=WeiSha.Common.Server.MapPath(centerImg);
//二维码图片对象
System.Drawing.Image image = null;
if (isQrcenter && System.IO.File.Exists(centerImg))
image = WeiSha.Common.QrcodeHepler.Encode(url, 200, centerImg, color, "#fff");
else
image = WeiSha.Common.QrcodeHepler.Encode(url, 200, color, "#fff");
//将image转为base64
string base64 = WeiSha.Common.Images.ImageTo.ToBase64(image);
entity.Org_QrCode = base64;
Gateway.Default.Save<Organization>(entity);
}
public Organization[] OrganAll(bool? isUse, int level)
{
//从缓存中读取
List<Organization> list = WeiSha.Common.Cache<Organization>.Data.List;
if (list == null || list.Count < 1) list = this.OrganBuildCache();
//linq查询
var from = from l in list select l;
if (level > 0) from = from.Where<Organization>(p => p.Olv_ID == level);
if (isUse != null) from = from.Where<Organization>(p => p.Org_IsUse == (bool)isUse);
List<Organization> tm = from.ToList<Organization>();
if (tm.Count > 0) return tm.ToArray<Organization>();
//orm查询
WhereClip wc = new WhereClip();
if (isUse != null) wc.And(Organization._.Org_IsUse == (bool)isUse);
if (level > -1) wc.And(Organization._.Olv_ID == level);
return Gateway.Default.From<Organization>().Where(wc)
.OrderBy(Organization._.Org_RegTime.Desc).ToArray<Organization>();
}
public Organization[] OrganCount(bool? isUse, bool? isShow, int level, int count)
{
WhereClip wc = new WhereClip();
if (isUse != null) wc.And(Organization._.Org_IsUse == (bool)isUse);
if (isShow != null) wc.And(Organization._.Org_IsShow == (bool)isShow);
if (level > 0) wc.And(Organization._.Olv_ID == level);
count = count > 0 ? count : int.MaxValue;
return Gateway.Default.From<Organization>().Where(wc)
.OrderBy(Organization._.Org_RegTime.Desc).ToArray<Organization>(count);
}
/// <summary>
/// 清理缓存文件
/// </summary>
/// <param name="orgid">机构id</param>
/// <param name="day">清理多少天之前的</param>
public void OrganClearTemp(int orgid, int day)
{
string tmpPath = WeiSha.Common.Upload.Get["Temp"].Physics;
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(tmpPath);
foreach (System.IO.FileInfo fi in di.GetFiles())
{
if (fi.CreationTime < DateTime.Now.AddDays(-day)) fi.Delete();
}
}
/// <summary>
/// 清理当前机构的数据
/// </summary>
/// <param name="orgid"></param>
public void OrganClear(int identify)
{
Organization org = this.OrganSingle(identify);
if (org.Org_IsRoot) return;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
//删除教师与学生
tran.Delete<Teacher>(Teacher._.Org_ID == identify);
//tran.Delete<TeacherHistory>(TeacherHistory._.Org_ID == identify);
tran.Delete<TeacherSort>(TeacherSort._.Org_ID == identify);
tran.Delete<Accounts>(Accounts._.Org_ID == identify);
tran.Delete<StudentSort>(StudentSort._.Org_ID == identify);
//删除课程
tran.Delete<Course>(Course._.Org_ID == identify);
tran.Delete<Student_Course>(Student_Course._.Org_ID == identify);
//删除试题、试卷、考试、成绩
tran.Delete<Questions>(Questions._.Org_ID == identify);
//tran.Delete<Student_Ques>(Student_Ques._.Org_ID == identify);
tran.Delete<TestPaper>(TestPaper._.Org_ID == identify);
tran.Delete<Examination>(Examination._.Org_ID == identify);
//tran.Delete<ExamResults>(ExamResults._.Org_ID == identify);
//删除知识库
tran.Delete<KnowledgeSort>(KnowledgeSort._.Org_ID == identify);
tran.Delete<Knowledge>(Knowledge._.Org_ID == identify);
//删除新闻、通知
tran.Delete<Columns>(Columns._.Org_ID == identify);
tran.Delete<Article>(Article._.Org_ID == identify);
tran.Delete<Notice>(Notice._.Org_ID == identify);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
private static object lock_cache_build = new object();
/// <summary>
/// 构建缓存
/// </summary>
public List<Organization> OrganBuildCache()
{
lock (lock_cache_build)
{
try
{
WeiSha.Common.Cache<Song.Entities.Organization>.Data.Clear();
}
catch
{
}
finally
{
Song.Entities.Organization[] org = Gateway.Default.From<Organization>()
.OrderBy(Organization._.Org_RegTime.Desc).ToArray<Organization>();
WeiSha.Common.Cache<Song.Entities.Organization>.Data.Fill(org);
}
return WeiSha.Common.Cache<Organization>.Data.List;
}
}
public Organization[] OrganPager(bool? isUse, int level, string searTxt, int size, int index, out int countSum)
{
WhereClip wc = new WhereClip();
if (isUse != null) wc.And(Organization._.Org_IsUse == (bool)isUse);
if (level > 0) wc.And(Organization._.Olv_ID == level);
if (!string.IsNullOrWhiteSpace(searTxt) && searTxt.Trim() != "")
wc.And(Organization._.Org_Name.Like("%" + searTxt + "%"));
countSum = Gateway.Default.Count<LinksSort>(wc);
return Gateway.Default.From<Organization>().Where(wc)
.OrderBy(Organization._.Org_RegTime.Desc)
.ToArray<Organization>(size, (index - 1) * size);
}
#region
/// <summary>
/// 添加机构等级
/// </summary>
/// <param name="entity">业务实体</param>
public void LevelAdd(OrganLevel entity)
{
//添加对象,并设置排序号
object obj = Gateway.Default.Max<OrganLevel>(OrganLevel._.Olv_Tax, OrganLevel._.Olv_Tax > -1);
int tax = obj is int ? (int)obj : 0;
entity.Olv_Tax = tax + 1;
//判断是否默认
obj = Gateway.Default.Count<OrganLevel>(OrganLevel._.Olv_IsDefault==true);
bool isDef = (obj is int ? (int)obj : 0) > 0;
if (!isDef) entity.Olv_IsDefault = true;
Gateway.Default.Save<OrganLevel>(entity);
}
/// <summary>
/// 修改
/// </summary>
/// <param name="entity">业务实体</param>
public void LevelSave(OrganLevel entity)
{
using (DbTrans trans = Gateway.Default.BeginTrans())
{
try
{
trans.Save<OrganLevel>(entity);
trans.Update<Organization>(new Field[] { Organization._.Olv_Name },
new object[] { entity.Olv_Name },
Organization._.Olv_ID == entity.Olv_ID);
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
finally
{
trans.Close();
}
}
}
public void LevelSetDefault(int identify)
{
using (DbTrans trans = Gateway.Default.BeginTrans())
{
try
{
trans.Update<OrganLevel>(new Field[] { OrganLevel._.Olv_IsDefault },
new object[] { true }, OrganLevel._.Olv_ID == identify);
trans.Update<OrganLevel>(new Field[] { OrganLevel._.Olv_IsDefault },
new object[] { false }, OrganLevel._.Olv_ID != identify);
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
finally
{
trans.Close();
}
}
}
/// <summary>
/// 获取对象
/// </summary>
/// <returns></returns>
public OrganLevel LevelSingle(int identify)
{
return Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_ID == identify).ToFirst<OrganLevel>();
}
/// <summary>
/// 默认的机构等级
/// </summary>
/// <returns></returns>
public OrganLevel LevelDefault()
{
return Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_IsDefault == true).ToFirst<OrganLevel>();
}
/// <summary>
/// 获取所有对象
/// </summary>
/// <returns></returns>
public OrganLevel[] LevelAll(bool? isUse)
{
WhereClip wc = new WhereClip();
if (isUse != null) wc.And(OrganLevel._.Olv_IsUse == (bool)isUse);
return Gateway.Default.From<OrganLevel>().Where(wc).OrderBy(OrganLevel._.Olv_Level.Desc).ToArray<OrganLevel>();
}
/// <summary>
/// 根据主键删除公司。
/// </summary>
/// <param name="identify">主键id</param>
public void LevelDelete(int identify)
{
Gateway.Default.Delete<OrganLevel>(OrganLevel._.Olv_ID == identify);
}
/// <summary>
/// 将当前栏目向上移动;仅在当前对象的同层移动,即同一父节点下的对象之间移动;
/// </summary>
/// <param name="id"></param>
/// <returns>如果已经处于顶端则返回false移动成功返回true</returns>
public bool LevelUp(int id)
{
//当前对象
OrganLevel current = Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_ID == id).ToFirst<OrganLevel>();
//当前对象排序号
int orderValue = (int)current.Olv_Tax;
//上一个对象,即兄长对象;
OrganLevel up = Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_Tax < orderValue).OrderBy(OrganLevel._.Olv_Tax.Desc).ToFirst<OrganLevel>();
//如果兄长对象不存在,则表示当前节点在兄弟中是老大;即是最顶点;
if (up == null) return false;
//交换排序号
current.Olv_Tax = up.Olv_Tax;
up.Olv_Tax = orderValue;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Save<OrganLevel>(current);
tran.Save<OrganLevel>(up);
tran.Commit();
return true;
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
/// <summary>
/// 将当前栏目向下移动;仅在当前对象的同层移动,即同一父节点下的对象之间移动;
/// </summary>
/// <param name="id"></param>
/// <returns>如果已经处于最底端则返回false移动成功返回true</returns>
public bool LevelDown(int id)
{
//当前对象
OrganLevel current = Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_ID == id).ToFirst<OrganLevel>();
//当前对象排序号
int orderValue = (int)current.Olv_Tax;
//下一个对象,即弟弟对象;
OrganLevel down = Gateway.Default.From<OrganLevel>().Where(OrganLevel._.Olv_Tax > orderValue).OrderBy(OrganLevel._.Olv_Tax.Asc).ToFirst<OrganLevel>();
//如果弟对象不存在,则表示当前节点在兄弟中是老幺;即是最底端;
if (down == null) return false;
//交换排序号
current.Olv_Tax = down.Olv_Tax;
down.Olv_Tax = orderValue;
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Save<OrganLevel>(current);
tran.Save<OrganLevel>(down);
tran.Commit();
return true;
}
catch
{
tran.Rollback();
throw;
}
finally
{
tran.Close();
}
}
}
#endregion
}
}