移动系统liao
2025-02-08 479b6cfc60113f692f6f9146bcd7b9231a32b0e8
Merge branch 'cyronghe'

# Conflicts:
# .gitignore
13个文件已修改
24个文件已添加
3151 ■■■■■ 已修改文件
.gitignore 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/ECTESTOA/ECTESTOA.csproj 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/ECTESTOA/ECTestOAconfig.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/ECTESTOA/IOAServices.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/ECTESTOA/OAServices.cs 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/EzFileUploadService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoCaiWuController.cs 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoJingLiController.cs 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoZHuGuanController.cs 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSSettingController.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSStaffController.cs 435 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/Users/Dtos/UserDto.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/Users/UserAppService.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/cylsg.Application.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Core/DbContext.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Core/SqlSugarRedisCache.cs 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Core/cylsg.Core.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OA_FirmAccount.cs 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OA_FirmAccountRecord.cs 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OA_FirmRole.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OA_FirmRolePermissionsRel.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaDepartment.cs 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaStaff.cs 384 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaStaffRoleRel.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaSubjectSet.cs 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaWorkPlan.cs 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaWorkPlanAttachment.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaWorkPlanShenpi.cs 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/Sys_Permissions_Menu.cs 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/Sys_Permissions_RoleMenuRelation.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/utilityViewModel/ECTESTOAPermissions.cs 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Web.Entry/appsettings.json 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Web.Entry/cylsg.Web.Entry.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.redis/EzCoreNetRedisService.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.redis/IEzCoreNetRedisService.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.sln 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -38,5 +38,10 @@
cylsg/cylsg.Application/cylsg.Application.xml
cylsg/cylsg.Web.Entry/application.log
cylsg/cylsg.Web.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user
<<<<<<< HEAD
cylsg/ECTESTOA/bin/
cylsg/ECTESTOA/obj/
=======
cylsg/ECTESTOA/obj/
cylsg/ECTESTOA/bin/
>>>>>>> cyronghe
cylsg/ECTESTOA/ECTESTOA.csproj
New file
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\cylsg.Core\cylsg.Core.csproj" />
    <ProjectReference Include="..\Cylsg.Filter\Cylsg.Filter.csproj" />
    <ProjectReference Include="..\cylsg.Model\cylsg.Model.csproj" />
    <ProjectReference Include="..\cylsg.redis\cylsg.redis.csproj" />
    <ProjectReference Include="..\cylsg.services\cylsg.services.csproj" />
    <ProjectReference Include="..\cylsg.utility\cylsg.utility.csproj" />
  </ItemGroup>
  <ItemGroup>
    <None Update="ECTestOAconfig.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>
cylsg/ECTESTOA/ECTestOAconfig.json
New file
@@ -0,0 +1,6 @@
{
  "EcTestOAMenuName": {
    "CaiWu": "报销付款"
  }
}
cylsg/ECTESTOA/IOAServices.cs
New file
@@ -0,0 +1,34 @@
using cylsg.Model.ECTEModel;
using cylsg.Model.utilityViewModel;
using Furion.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ECTESTOA
{
    /// <summary>
    /// 川印OA数据库服务
    /// </summary>
    public interface IOAServices
    {
        /// <summary>
        /// 获OA取权限配置
        /// </summary>
        /// <returns></returns>
         Task<ECTESTOAPermissions> GetOAPermissions();
        /// <summary>
        /// 四川印刷集团 租户ID  固定
        /// </summary>
        Guid firmId { get; }
        Task<OaWorkPlan> GetWorkPlans();
    }
}
cylsg/ECTESTOA/OAServices.cs
New file
@@ -0,0 +1,113 @@
using cylsg.Model.ECTEModel;
using cylsg.Model.UserModel;
using cylsg.Model.utilityViewModel;
using cylsg.utility.Extend;
using EzCoreNet.Redis;
using Furion;
using Furion.DependencyInjection;
using Furion.FriendlyException;
using Models;
using SqlSugar;
using System.Security.Claims;
namespace ECTESTOA
{
    /// <summary>
    /// 川印相关的OA 服务
    /// </summary>
    public class OAServices : IOAServices, IScoped
    {
        private static  string ECTESTOAPermissionsKey= "ECTESTOAPermissionsKey:";
        /// <summary>
        /// redis服务
        /// </summary>
        private readonly IEzCoreNetRedisService _redisService;
        private ISqlSugarClient _OAsqlSugarClient;
        private ISqlSugarClient _sqlSugarClient;
        public    Guid firmId => new Guid( "88B49967-D590-452C-93C6-0049A75FA5FF");
        public OAServices ( IEzCoreNetRedisService ezCoreNetRedisService,ISqlSugarClient sqlSugarClient)
        {
            _redisService = ezCoreNetRedisService;
            _sqlSugarClient = sqlSugarClient;
             _OAsqlSugarClient = sqlSugarClient .AsTenant().GetConnection("ECTESTOADB");
        }
      public  async Task< ECTESTOAPermissions> GetOAPermissions()
        {
            var UserID = App.User?.FindFirstValue("UserID");
            if(string.IsNullOrEmpty(UserID))
            {
                throw Oops.Oh("没有登录信息,不可使用");
            }
            var ret=    _redisService.Get<ECTESTOAPermissions>(ECTESTOAPermissionsKey + UserID);
            if(ret != null)
            {
                return ret;
            }
            else
            {
                string CaiwuKey = App.Configuration["EcTestOAMenuName:CaiWu"] ?? "没有";
               var CaiWUMenuiId= await  _OAsqlSugarClient.Queryable<Sys_Permissions_Menu>().Where(x => x.IsUsed == true && x.MenuName == CaiwuKey).Select(x=>x.Keyid).WithCache(600).FirstAsync();
                int id = UserID?.toInt() ?? 0;
                if (id == 0)
                    throw Oops.Oh("登录信息错误");
                var user  = await _sqlSugarClient.Queryable<User>().Where(x => x.Id == id && x.IsEn == true && x.IsDeleted == false).WithCache(180).FirstAsync();
                if (user==null)
                {
                    throw Oops.Oh("登录信息错误,不是有效用户");
                }
                //重新获取权限
                ret = await _OAsqlSugarClient.Queryable<OaStaff>().Includes(x => x.Department).Where(x => x.MobieNum == user.ItCode && x.FirmId == firmId).Select(x => new ECTESTOAPermissions
                {
                    DepartmentName = x.Department.Name,
                     DepartId=x.DepartmentId,
                },true
                ).FirstAsync();
                if (ret == null)
                {
                    //不是用户,3分钟后重新查询
                    ret = new ECTESTOAPermissions();
                }
                else
                {
                    if (CaiWUMenuiId > 0&&ret.KeyId>0)
                    {
                     var Caiwu= await    _OAsqlSugarClient.Queryable<OA_StaffRoleRel, OA_FirmRole, OA_FirmRolePermissionsRel>((sr,fr,spr)=>new JoinQueryInfos(
                            JoinType.Left,sr.RoleId==fr.Keyid&&fr.FirmId== firmId&& sr.FirmId==firmId&&fr.IsUsed==true,
                            JoinType.Left,fr.Keyid==spr.RoleId
                            ) ).Where((sr, fr, spr)=>spr.MenuIdThree== CaiWUMenuiId&&sr.StaffId==ret.KeyId).Select((sr, fr, spr) => spr.MenuIdThree).FirstAsync();
                        if(Caiwu>0)
                        {
                            ret.BF_IsCaiWu = true;
                        }
                    }
                }
                _redisService.Add(ECTESTOAPermissionsKey + UserID, ret, 180);
            }
            return ret;
        }
        public Task<OaWorkPlan> GetWorkPlans()
        {
            throw new NotImplementedException();
        }
    }
}
cylsg/EzUpFile/EzFileUploadService.cs
@@ -349,7 +349,7 @@
                catch (Exception e)
                {
                    throw Oops.Oh(e.Message);
                    throw Oops.Oh(e.Message+"腾讯云,或者阿里云操作错误");
                }
            }
            catch (Exception e)
@@ -371,7 +371,7 @@
                if (FileData.Length > maxSize)
                {
                    throw Oops.Oh(" 上传文件不可超出500K");
                    throw Oops.Oh(" 上传文件不可超出5M");
                }
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoCaiWuController.cs
New file
@@ -0,0 +1,261 @@
using cylsg.Model.ECTEModel;
using cylsg.Model.utilityViewModel;
using ECTESTOA;
using Furion.LinqBuilder;
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.UnionShopTargetAddPlanRequest.Types;
namespace cylsg.Application.CyOS
{
    /// <summary>
    /// 财务报销控制器
    /// </summary>
    [Authorize]
    public  class CyOSBaoXiaoCaiWuController: IDynamicApiController
    {
        private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
        private readonly IOAServices _OAServices;
        private readonly ISqlSugarClient _SugarClient;
        private ECTESTOAPermissions Permissions;
        public CyOSBaoXiaoCaiWuController(IOAServices oaservices, ISqlSugarClient sugarClient)
        {
            _OAServices = oaservices;
            _SugarClient = sugarClient.AsTenant().GetConnection("ECTESTOADB");
        }
        /// <summary>
        ///  查询
        /// </summary>
        [HttpPost]
        public async Task<WorekPlandto> getplanelist(SearchOaWorekPlan param)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            Expression<Func<OaWorkPlan, bool>> SearchList = (x) => true;
            SearchList = SearchList.And(x => x.ApprovalStatus != PlanStatusType.Uncommitted);
            //川印工作单
            SearchList = SearchList.And(x => x.MemberId == _OAServices.firmId);
            SearchList = SearchList.And(x => x.PlanType == 3);
            SearchList = SearchList.And(x => x.PlanDataType == 17);
            //必须是审批完成后的单
            SearchList = SearchList.And(x=>x.ApprovalStatus== PlanStatusType.Yes);
            if (!string.IsNullOrEmpty(param.StaffName))
            {
                SearchList = SearchList.And(x => x.SentStaff.Name.Contains(param.StaffName));
            }
            if (param.StaffMemberIdId != null)
            {
                SearchList = SearchList.And(x => x.SentStaffId == param.StaffMemberIdId);
            }
            if (param.PlanDataType > 0)
            {
                SearchList = SearchList.And(x => x.PlanDataType == param.PlanDataType);
            }
            if (param.PlanStartTimeStart != null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime > param.PlanStartTimeStart);
            }
            if (param.PlanStartTimeEnd != null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime <= param.PlanStartTimeEnd.Value.AddDays(1));
            }
            ////审批状态
            //if (param.ApprovalStatus != null)
            //{
            //    SearchList = SearchList.And(x => x.ApprovalStatus == param.ApprovalStatus);
            //}
            //报销状态
            if (param.EvaluationStatus != null)
            {
                SearchList = SearchList.And(x => x.EvaluationStatus == param.EvaluationStatus);
            }
            //强制增加员工过滤
            RefAsync<int> totle = 0;
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.OaWorkPlanShenpis).Includes(x=>x.SentStaff)
                .Where(SearchList).OrderByDescending(x => x.MemberId).ToPageListAsync(param.page.PageIndex, param.page.PageSize, totle);
            param.page.TotalCount = totle;
            var sum = await _SugarClient.Queryable<OaWorkPlan>()
                .Where(SearchList).SumAsync(x => x.PlanMoney);
            return new WorekPlandto
            {
                list = data,
                page = param.page,
                TotalMoney = sum ?? 0
            };
        }
        /// <summary>
        ///  获取报销单详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<OaWorkPlan> GetPlanInfo(int id)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            return await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.OaWorkPlanShenpis,y=>y.ApprovalStaff).Includes(x => x.SentStaff).Includes(x => x.Depart).Includes(x=>x.WorkPlanAttachments).Where(x => x.Keyid == id).FirstAsync();
        }
        /// <summary>
        /// 报销
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<bool> ApprovalPlan(OaWorkPlan plan)
        {
            // 等待信号量
            await _semaphore.WaitAsync();
            try
            {
                if (plan.Keyid == 0)
                    throw Oops.Oh("ID错误");
                if (plan.FirmAccountId == null)
                    throw Oops.Oh("必须选择银行账号");
                if (!await CheckRols())
                {
                    throw Oops.Oh("没有权限");
                }
                var FirmAccount = await _SugarClient.Queryable<OA_FirmAccount>().Where(x => x.FirmId == _OAServices.firmId && x.Keyid == plan.FirmAccountId && x.Status == true).FirstAsync();
                if (FirmAccount == null)
                    throw Oops.Oh("账号错误");
                var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.SentStaff).Where(x => x.Keyid == plan.Keyid).FirstAsync();
                if (data == null)
                    throw Oops.Oh("没有找到报销单");
                if (data.ApprovalStatus != PlanStatusType.Yes)
                    throw Oops.Oh("未审批完成,不可报销");
                if (data.EvaluationStatus != BaoxiaoStausType.Reimbursed)
                {
                    await _SugarClient.AsTenant().BeginTranAsync();
                    try
                    {
                        data.EvaluationStatus = BaoxiaoStausType.Reimbursed;
                        //data.PlanContent = plan.PlanContent;
                        data.LastUpdateTime = DateTime.Now;
                        await _SugarClient.Updateable(data).ExecuteCommandAsync();
                        FirmAccount.LastUpdateTime = DateTime.Now;
                        FirmAccount.Balance -= (Math.Round(data.PlanMoney ?? 0, 2));
                        FirmAccount.AllExpenses += (Math.Round(data.PlanMoney ?? 0, 2));
                        await _SugarClient.Updateable(FirmAccount).ExecuteCommandAsync();
                        OA_FirmAccountRecord rec = new OA_FirmAccountRecord
                        {
                            AccountId = FirmAccount.Keyid,
                            Money = data.PlanMoney ?? 0,
                            LastUpdateTime = DateTime.Now,
                            Department = data.PlanContent,
                            RecordTypeId = 2,
                            SubjectId = 3,//报销必须为3
                            Operator = Permissions.Name,
                            PaymentUnit = data.SentStaff.Name,
                            ResidualAmount = FirmAccount.Balance,
                            OperationalMatters = data.PlanContent,
                        };
                        await _SugarClient.Insertable(rec).ExecuteCommandAsync();
                        await _SugarClient.Updateable(data).ExecuteCommandAsync();
                        await _SugarClient.AsTenant().CommitTranAsync();
                        return true;
                    }
                    catch (Exception)
                    {
                        await _SugarClient.AsTenant().RollbackTranAsync();
                        throw;
                    }
                }
                return true;
            }
            catch(Exception e)
            {
                throw;
            }
            finally
            {
                // 释放信号量
                _semaphore.Release();
            }
        }
        /// <summary>
        /// 获取账户列表
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<List<OA_FirmAccount>> GetFirmAccountList()
        {
            return await _SugarClient.Queryable<OA_FirmAccount>().Where(x => x.Status == true && x.FirmId == _OAServices.firmId).Select(x => new OA_FirmAccount
            {
                AccountName = x.AccountName,
                 AccountType = x.AccountType,
                  UserName = x.UserName,
                  Keyid=x.Keyid,
            }).WithCache(3600).ToListAsync();
        }
        /// <summary>
        /// 判断是否具有权限
        /// </summary>
        /// <returns></returns>
        private async Task<bool> CheckRols()
        {
            var pr = await _OAServices.GetOAPermissions();
            Permissions = pr;
            if (pr != null && pr.MemberId != null)
            {
                if (pr.BF_IsCaiWu)
                    return true;
                else return false;
            }
            else
                return false;
        }
    }
}
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoJingLiController.cs
New file
@@ -0,0 +1,231 @@
using cylsg.Model.ECTEModel;
using cylsg.Model.utilityViewModel;
using cylsg.utility.Extend;
using ECTESTOA;
using Furion.LinqBuilder;
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Application.CyOS
{
    /// <summary>
    /// 川印报销经理API
    /// </summary>
    [Authorize]
    public class CyOSBaoXiaoJingLiController: IDynamicApiController
    {
        private readonly IOAServices _OAServices;
        private readonly ISqlSugarClient _SugarClient;
        private ECTESTOAPermissions Permissions;
        public CyOSBaoXiaoJingLiController(IOAServices oaservices, ISqlSugarClient sugarClient)
        {
            _OAServices = oaservices;
            _SugarClient = sugarClient.AsTenant().GetConnection("ECTESTOADB");
        }
        /// <summary>
        ///  查询
        /// </summary>
        [HttpPost]
        public async Task<WorekPlandto> getplanelist(SearchOaWorekPlan param)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            Expression<Func<OaWorkPlan, bool>> SearchList = (x) => true;
            //川印工作单
            SearchList = SearchList.And(x => x.ApprovalStatus != PlanStatusType.Uncommitted);
            SearchList = SearchList.And(x => x.MemberId == _OAServices.firmId);
            SearchList = SearchList.And(x => x.PlanType == 3);
            SearchList = SearchList.And(x => x.PlanDataType == 17);
            //必须有两个人审批过了
            SearchList = SearchList.And(x => x.OaWorkPlanShenpis.Count(y=>y.Buzhou==1)>1||(x.ApprovalStatus!= PlanStatusType.unApproval));
            if (!string.IsNullOrEmpty(param.StaffName))
            {
                SearchList = SearchList.And(x => x.SentStaff.Name.Contains(param.StaffName));
            }
            if (param.StaffMemberIdId != null)
            {
                SearchList = SearchList.And(x => x.MemberId == param.StaffMemberIdId);
            }
            if (param.PlanDataType > 0)
            {
                SearchList = SearchList.And(x => x.PlanDataType == param.PlanDataType);
            }
            if (param.PlanStartTimeStart != null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime >param.PlanStartTimeStart);
            }
            if (param.PlanStartTimeEnd != null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime <= param.PlanStartTimeEnd.Value.AddDays(1));
            }
            //审批状态
            if (param.ApprovalStatus != null)
            {
                    SearchList = SearchList.And(x => x.ApprovalStatus == param.ApprovalStatus);
            }
            //报销状态
            if (param.EvaluationStatus != null)
            {
                SearchList = SearchList.And(x => x.EvaluationStatus == param.EvaluationStatus);
            }
            //强制增加员工过滤
            RefAsync<int> totle = 0;
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.OaWorkPlanShenpis.Where(y=>y.Buzhou==1).ToList()).Includes(x => x.Depart)
                .Where(SearchList).OrderByDescending(x => x.PlanStartTime).ToPageListAsync(param.page.PageIndex, param.page.PageSize, totle);
            var sum = await _SugarClient.Queryable<OaWorkPlan>()
                .Where(SearchList).SumAsync(x=>x.PlanMoney);
            param.page.TotalCount = totle;
            return new WorekPlandto
            {
                list = data,
                page = param.page,
                TotalMoney = sum ?? 0
            };
        }
        /// <summary>
        ///  获取报销单详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<OaWorkPlan> GetPlanInfo(int id)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            return await _SugarClient.Queryable<OaWorkPlan>().Includes(x=>x.OaWorkPlanShenpis,y=>y.ApprovalStaff).Includes(x=>x.SentStaff).Includes(x=>x.Depart).Includes(x=>x.WorkPlanAttachments).Where(x => x.Keyid == id).FirstAsync();
        }
        /// <summary>
        /// 审批权限
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<bool> BaoxiaoPlan(OaWorkPlanShenpi param)
        {
            if (param.ApprovalStatus == PlanStatusType.unApproval)
                throw Oops.Oh("不可设置为未审批状态");
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.OaWorkPlanShenpis).Where(x => x.Keyid == param.OA_WorkPlanId).FirstAsync();
            if (data == null)
                throw Oops.Oh("没有找到报销单");
            if ( data.ApprovalStatus != PlanStatusType.unApproval)
                throw Oops.Oh("报销单已经批复完毕");
            if (data.ApprovalStatus == PlanStatusType.Uncommitted)
            {
                throw Oops.Oh("报销单未提交不可审批");
            }
            OaWorkPlanShenpi shenpi = data.OaWorkPlanShenpis.Where(x => x.ApprovalStaffId == Permissions.MemberId&&x.Buzhou==2).FirstOrDefault();
            await _SugarClient.AsTenant().BeginTranAsync();
            try
            {
                if (shenpi != null)
                {
                    //已经批复
                    throw Oops.Oh("报销单已经批复完毕 不可更改");
                    //shenpi.ApprovalStatus = param.ApprovalStatus;
                    //shenpi.Buzhou = 2;
                    //shenpi.ApprovalTime = DateTime.Now;
                    //shenpi.ApprovalContent = param.ApprovalContent;
                    //await _SugarClient.Updateable(shenpi).ExecuteCommandAsync();
                }
                else
                {
                    shenpi = new OaWorkPlanShenpi()
                    {
                        ApprovalStaffId = Permissions.MemberId,
                        ApprovalContent = param.ApprovalContent,
                        ApprovalStatus = param.ApprovalStatus,
                        ApprovalTime = DateTime.Now,
                        ///总经理审批为2
                        Buzhou = 2,
                        CreateTime = DateTime.Now,
                        Operator = Permissions.Name,
                        OA_WorkPlanId = param.OA_WorkPlanId,
                    };
                    await _SugarClient.Insertable(shenpi).ExecuteCommandAsync();
                }
                if(!(param.RewardResult?.isPureNum()==true))
                {
                    throw Oops.Oh("科目选择错误");
                }
                //审批时可修改内容
                data.RewardResult = param.RewardResult;
                data.PlanContent = param.PlanContent;
                if(param.PlanMoney>0&&param.PlanMoney<=data.PlanMoney)
                data.PlanMoney = param.PlanMoney;
                data.ApprovalTime = DateTime.Now;
                data.ApprovalStatus = param.ApprovalStatus;
                data.ApprovalContent = param.ApprovalContent;
                data.LastUpdateTime = DateTime.Now;
                await _SugarClient.Updateable(data).ExecuteCommandAsync();
                await _SugarClient.AsTenant().CommitTranAsync();
                return true;
            }
            catch (Exception e)
            {
                await _SugarClient.AsTenant().RollbackTranAsync();
                throw;
            }
        }
        /// <summary>
        /// 判断是否具有权限
        /// </summary>
        /// <returns></returns>
        private async Task<bool> CheckRols()
        {
            var pr = await _OAServices.GetOAPermissions();
            Permissions = pr;
            if (pr != null && pr.MemberId != null)
            {
                if (pr.BF_Isbaoxiaojingli)
                    return true;
                else return false;
            }
            else
                return false;
        }
    }
}
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoZHuGuanController.cs
New file
@@ -0,0 +1,255 @@
using cylsg.Model.ECTEModel;
using cylsg.Model.utilityViewModel;
using ECTESTOA;
using Furion.LinqBuilder;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Application.CyOS
{
    /// <summary>
    /// 报销主管相关控制器
    /// </summary>
    [Authorize]
    public class CyOSBaoXiaoZHuGuanController: IDynamicApiController
    {
        private readonly IOAServices _OAServices;
        private readonly ISqlSugarClient _SugarClient;
        private ECTESTOAPermissions Permissions;
        public CyOSBaoXiaoZHuGuanController(IOAServices oaservices, ISqlSugarClient sugarClient)
        {
            _OAServices = oaservices;
            _SugarClient = sugarClient.AsTenant().GetConnection("ECTESTOADB");
        }
        /// <summary>
        ///  查询
        /// </summary>
        [HttpPost]
        public async Task<WorekPlandto> getplanelist(SearchOaWorekPlan param)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            Expression<Func<OaWorkPlan, bool>> SearchList = (x) => true;
            //川印工作单
            SearchList = SearchList.And(x => x.ApprovalStatus != PlanStatusType.Uncommitted);
            SearchList = SearchList.And(x => x.MemberId == _OAServices.firmId);
            SearchList = SearchList.And(x => x.PlanType == 3);
            SearchList = SearchList.And(x => x.PlanDataType == 17);
            //SearchList = SearchList.And(x =>  x.ApprovalStatus == PlanStatusType.unApproval);
            //SearchList = SearchList.And(x =>  x.OaWorkPlanShenpis.Where(y => y.Buzhou == 1 && y.ApprovalStaffId == Permissions.MemberId).Count()<=0);
            //SearchList = SearchList.And(x => x.DepartId == Permissions.DepartId); 部门筛选
            if (!string.IsNullOrEmpty(param.StaffName))
            {
                SearchList = SearchList.And(x => x.SentStaff.Name.Contains(param.StaffName));
            }
            if (param.StaffMemberIdId != null)
            {
                SearchList = SearchList.And(x => x.MemberId == param.StaffMemberIdId);
            }
            if (param.PlanDataType > 0)
            {
                SearchList = SearchList.And(x => x.PlanDataType == param.PlanDataType);
            }
            if (param.PlanStartTimeStart != null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime > param.PlanStartTimeStart);
            }
            if (param.PlanStartTimeEnd != null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime <= param.PlanStartTimeEnd.Value.AddDays(1));
            }
            //审批状态
            if (param.ApprovalStatus != null)
            {
                if (param.ApprovalStatus == PlanStatusType.Yes)
                    SearchList = SearchList.And(x => x.ApprovalStatus == param.ApprovalStatus || ((x.OaWorkPlanShenpis.Count(y => y.ApprovalStatus == PlanStatusType.Yes&&y.ApprovalStaffId==Permissions.MemberId && y.Buzhou == 1) >0)));
                else  if(param.ApprovalStatus == PlanStatusType.No)
                {
                    SearchList = SearchList.And(x => x.ApprovalStatus == param.ApprovalStatus );
                }
                else
                {
                    SearchList= SearchList.And(x=>x.ApprovalStatus== PlanStatusType.unApproval&&(x.OaWorkPlanShenpis.Count(y => y.Buzhou == 1&& y.ApprovalStaffId == Permissions.MemberId) <=0));
                }
            }
            //报销状态
            if (param.EvaluationStatus != null)
            {
                SearchList = SearchList.And(x => x.EvaluationStatus == param.EvaluationStatus);
            }
            RefAsync<int> totle = 0;
            //强制增加员工过滤
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x=>x.Depart)
                    .Includes(x=>x.OaWorkPlanShenpis.Where(y=>y.ApprovalStaffId==Permissions.MemberId&&y.Buzhou==1).ToList())
                    .Where(SearchList).OrderByDescending(x => x.PlanStartTime).Mapper(
                    x =>
                    {
                        if (x.ApprovalStatus == PlanStatusType.unApproval)
                        {
                            var oashenpi = x.OaWorkPlanShenpis?.FirstOrDefault();
                            if (oashenpi != null)
                                x.ApprovalStatus = oashenpi.ApprovalStatus;
                        }
                            ;
                    }
                    ).ToPageListAsync(param.page.PageIndex, param.page.PageSize, totle);
            param.page.TotalCount = totle;
            var sum = await _SugarClient.Queryable<OaWorkPlan>()
             .Where(SearchList).SumAsync(x => x.PlanMoney);
            return new WorekPlandto
                {
                    list = data,
                    page = param.page,
                TotalMoney = sum ?? 0
            };
        }
        /// <summary>
        ///  获取报销单详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<OaWorkPlan> GetPlanInfo(int id)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            return await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.OaWorkPlanShenpis.Where(y => y.Buzhou == 1).ToList(), y => y.ApprovalStaff).Includes(x => x.SentStaff).Includes(x => x.Depart).Includes(x => x.WorkPlanAttachments).Where(x=>x.Keyid==id).Mapper(x=>
            {
                if (x.ApprovalStatus == PlanStatusType.unApproval)
                {
                    var oashenpi = x.OaWorkPlanShenpis?.Where(x=>x.ApprovalStaffId==Permissions.MemberId).FirstOrDefault();
                    if (oashenpi != null)
                        x.ApprovalStatus = oashenpi.ApprovalStatus;
                }
                            ;
            }).FirstAsync();
        }
        /// <summary>
        /// 审批权限
        /// </summary>
        /// <returns></returns>
         [HttpPost]
        public async Task<bool> ApprovalPlan(OaWorkPlanShenpi param)
        {
            if (param.ApprovalStatus == PlanStatusType.unApproval)
                throw Oops.Oh("不可设置为未审批状态");
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x=>x.OaWorkPlanShenpis).Where(x => x.Keyid == param.OA_WorkPlanId).FirstAsync();
            if (data == null)
                throw Oops.Oh("没有找到报销单");
            if (data.ApprovalStatus != null && data.ApprovalStatus != PlanStatusType.unApproval)
                throw Oops.Oh("报销单已经批复完毕");
            if(data.ApprovalStatus== PlanStatusType.Uncommitted)
            {
                throw Oops.Oh("报销单未提交不可审批");
            }
            OaWorkPlanShenpi shenpi = data.OaWorkPlanShenpis.Where(x => x.ApprovalStaffId == Permissions.MemberId&&x.Buzhou==1).FirstOrDefault();
             if (shenpi!=null)
            {
                //自己已经批复,不可更改
                throw Oops.Oh("报销单已经批复");
                //shenpi.ApprovalStatus = PlanStatusType.Yes;
                //await _SugarClient.Updateable(shenpi).ExecuteCommandAsync();
            }
             else
            {
                data.RewardResult = param.RewardResult;
                data.PlanContent = param.PlanContent;
                if (param.PlanMoney > 0 && param.PlanMoney <= data.PlanMoney)
                    data.PlanMoney = param.PlanMoney;
                await   _SugarClient.AsTenant().BeginTranAsync();
                try
                {
                    if (param.ApprovalStatus == PlanStatusType.No)
                    {
                        //当有人审批拒绝后直接将申请单设置为拒绝,不在进行其他审核
                        data.ApprovalStatus = PlanStatusType.No;
                        data.ApprovalTime = DateTime.Now;
                        data.LastUpdateTime = DateTime.Now;
                        data.Operator = Permissions.Name;
                       await  _SugarClient.Updateable(data).ExecuteCommandAsync();
                    }
                    shenpi = new OaWorkPlanShenpi()
                    {
                        ApprovalStaffId = Permissions.MemberId,
                        ApprovalContent = param.ApprovalContent,
                        ApprovalStatus = param.ApprovalStatus,
                        ApprovalTime = DateTime.Now,
                        Buzhou = 1,
                        CreateTime = DateTime.Now,
                        Operator = Permissions.Name,
                        OA_WorkPlanId = param.OA_WorkPlanId,
                    };
                    await _SugarClient.Insertable(shenpi).ExecuteCommandAsync();
                    await _SugarClient.AsTenant().CommitTranAsync();
                }
                catch (Exception)
                {
                    await _SugarClient.AsTenant().RollbackTranAsync();
                    throw;
                }
            }
            return true;
        }
        /// <summary>
        /// 判断是否具有权限
        /// </summary>
        /// <returns></returns>
        private async Task<bool> CheckRols()
        {
            var pr = await _OAServices.GetOAPermissions();
            Permissions = pr;
            if (pr != null && pr.MemberId != null)
            {
                if ( pr.BF_IsBaoxiaozhuguan)
                    return true;
                else return false;
            }
            else
                return false;
        }
    }
}
cylsg/cylsg.Application/CyOS/CyOSSettingController.cs
New file
@@ -0,0 +1,67 @@
using cylsg.Model.ECTEModel;
using ECTESTOA;
using EzCoreNet.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Application.CyOS
{
    /// <summary>
    /// 川印通用信息获取
    /// </summary>
    public class CYOSSettingController: IDynamicApiController
    {
        private readonly ISqlSugarClient _client;
        private readonly IOAServices _oAServices;
        private readonly IEzCoreNetRedisService _eZCoreNetRedisService;
        public CYOSSettingController( ISqlSugarClient client,IOAServices oAServices,IEzCoreNetRedisService netRedisService )
        {
            _client = client.AsTenant().GetConnection("ECTESTOADB");
            _oAServices = oAServices;
            _eZCoreNetRedisService = netRedisService;
        }
        /// <summary>
        /// 获取部门列表
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task< List<OaDepartment>> GetDepartLstt()
        {
            return await _client.Queryable<OaDepartment>().Where(x=>x.Status== "启用"&&x.FirmId== _oAServices.firmId).Select(x=>new OaDepartment
            {
                  Name=x.Name,
                    Keyid=x.Keyid,
                     Remark=x.Remark,
            }).WithCache(3600).ToListAsync();
        }
        /// <summary>
        /// 获取科目列表
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<List<OaSubjectSet>> getKeMuList()
        {
            return await _client.Queryable<OaSubjectSet>().Where(x => x.Status == true && x.FirmId == _oAServices.firmId&& x.SubjectType=="贷").Select(x => new OaSubjectSet
            {
                SubjectName = x.SubjectName,
                Keyid = x.Keyid,
                Remark = x.Remark,
            }).WithCache(3600).ToListAsync();
        }
        /// <summary>
        /// 获取流水号
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public  string GetShowID()
        {
          return   _eZCoreNetRedisService.GetYYYMMddAnd4sn();
        }
    }
}
cylsg/cylsg.Application/CyOS/CyOSStaffController.cs
New file
@@ -0,0 +1,435 @@
using cylsg.Core;
using cylsg.Model.ECTEModel;
using cylsg.Model.TransferOrder;
using cylsg.Model.utilityViewModel;
using cylsg.utility.Extend;
using Cylsg.Filter;
using ECTESTOA;
using EzCoreNet.Redis;
using Furion.LinqBuilder;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using TencentCloud.Hunyuan.V20230901.Models;
using TencentCloud.Mrs.V20200910.Models;
namespace cylsg.Application.CyOS
{
    /// <summary>
    /// 川印普通员工控制器
    /// </summary>
    [Authorize]
    public class CyOSStaffController : IDynamicApiController
    {
        private readonly IOAServices _OAServices;
        private readonly ISqlSugarClient _SugarClient;
        private readonly IEzCoreNetRedisService _ezCoreNetRedisService;
        private  ECTESTOAPermissions Permissions;
        public CyOSStaffController(IOAServices oaServices, ISqlSugarClient sugarClient,IEzCoreNetRedisService netRedisService)
        {
            _OAServices = oaServices;
            _SugarClient = sugarClient.AsTenant().GetConnection("ECTESTOADB");
            _ezCoreNetRedisService = netRedisService;
        }
        /// <summary>
        /// 查询
        /// </summary>
        [HttpPost]
        public async Task<WorekPlandto> getplanelist(SearchOaWorekPlan param)
        {
            if(! await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            Expression<Func<OaWorkPlan, bool>> SearchList = (x) => true;
            SearchList = SearchList.And(x => x.MemberId == _OAServices.firmId);
            SearchList = SearchList.And(x => x.PlanType == 3);
            SearchList = SearchList.And(x => x.PlanDataType == 17);
            if (!string.IsNullOrEmpty(param.StaffName))
            {
                SearchList = SearchList.And(x => x.SentStaff.Name.Contains(param.StaffName));
            }
            if ( param.StaffMemberIdId !=null)
            {
                SearchList = SearchList.And(x => x.SentStaffId==param.StaffMemberIdId);
            }
            if(param.PlanDataType >0)
            {
                SearchList = SearchList.And(x => x.PlanDataType==param.PlanDataType);
            }
            if (param.PlanStartTimeStart !=null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime> param.PlanStartTimeStart);
            }
            if (param.PlanStartTimeEnd != null)
            {
                SearchList = SearchList.And(x => x.PlanStartTime <= param.PlanStartTimeEnd.Value.AddDays(1));
            }
            //审批状态
            if (param.ApprovalStatus != null)
            {
                SearchList = SearchList.And(x => x.ApprovalStatus == param.ApprovalStatus);
            }
            //报销状态
            if (param.EvaluationStatus != null)
            {
                SearchList = SearchList.And(x => x.EvaluationStatus == param.EvaluationStatus);
            }
            //强制增加员工过滤
            SearchList = SearchList.And(x => x.SentStaffId == Permissions.MemberId);
            RefAsync<int> totle=0;
          var data= await    _SugarClient.Queryable< OaWorkPlan >().Includes(x=>x.SentStaff).Includes(x=>x.OaWorkPlanShenpis).Where(SearchList).OrderByDescending(x => x.PlanStartTime).ToPageListAsync(param.page.PageIndex,param.page.PageSize, totle);
            param.page.TotalCount = totle;
            var sum = await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.SentStaff).Where(SearchList).SumAsync(x => x.PlanMoney);
            return new WorekPlandto
            {
                list = data,
                page = param.page,
                TotalMoney=sum??0
            };
        }
        /// <summary>
        /// 创建报销单
        /// </summary>
        /// <param name="pram"></param>
        /// <returns></returns>
        [LimitFilter(LimiType = Limttype.User, timespan = 10, ResponseMeg = "请勿在10秒内重复申请该接口")]
        public  async Task<bool> CreatOderAsync(OaWorkPlan pram)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            if(pram.PlanMoney<=0)
            {
                throw Oops.Oh("报销金额不可小于等于0");
            }
            if(string.IsNullOrEmpty(pram.PlanContent))
            {
                throw Oops.Oh("报销摘要不可为空");
            }
            if(pram.HoubufapiaoStatus==null)
            {
                throw Oops.Oh("发票状态不可为空");
            }
             if(string.IsNullOrEmpty(pram.RewardResult))
            {
                throw Oops.Oh("科目ID RewardResult不能为空");
            }
            OaSubjectSet? kemu = null;
            try
            {
             var kemuid=     pram.RewardResult.toInt();
               kemu=  _SugarClient.Queryable<OaSubjectSet>().Where(x => x.Keyid == kemuid && x.FirmId == _OAServices.firmId && x.SubjectType == "贷" && x.Status == true).First();
                if(kemu==null)
                    throw Oops.Oh("科目选择错误,或者失效");
            }
            catch (Exception)
            {
                throw Oops.Oh("科目 RewardResult 选择错误,或者失效");
            }
            if(pram.HoubufapiaoStatus== HoubufapiaoStatusType.You)
            {
               if( pram.WorkPlanAttachments.Where(x=>x.AttachmentType==1).Count()<=0)
                throw Oops.Oh("有发票时,必须上传发票");
            }
            if (pram.WorkPlanAttachments?.Count > 0)
            {
                foreach (var item in pram.WorkPlanAttachments)
                {
                   if( item.AttachmentType<=0||item.AttachmentType>3)
                        throw Oops.Oh("附件类型AttachmentType错误");
                   if(string.IsNullOrEmpty(item.PlanAttachment))
                    {
                        throw Oops.Oh("附件地址不能为空");
                    }
                    item.CreateTime = DateTime.Now;
                    item.Operator = Permissions.Name;
                }
            }
            if (pram.ApprovalStatus != PlanStatusType.Uncommitted)
                pram.EvaluationContent = _ezCoreNetRedisService.GetYYYMMddAnd4sn();
            else
                pram.EvaluationContent = "";
            pram.PlanType = 3;//固定为3
            pram.MemberId = _OAServices.firmId;
            pram.SentStaffId = Permissions.MemberId;
            pram.ReciveStaffId = Permissions.MemberId;
            pram.PlanDataType = 17;
            pram.DepartId = Permissions.DepartId;
            pram.PlanStartTime = DateTime.Now;
            pram.RewardContent = kemu.SubjectName;
            pram.LastUpdateTime = DateTime.Now;
            pram.Operator = Permissions.Name;
            pram.PlanTitle = "";
            pram.PlanRunTime = DateTime.Now;
            pram.PlanRemark = "";
            pram.PlanPeople = Permissions.Name;
            pram.PlanComplany = "";
            if(pram.PlanStatus!= PlanStatusType.Uncommitted)
            {
                pram.PlanStatus = PlanStatusType.unApproval;
            }
            pram.ApprovalStaffId = Guid.Empty;
            pram.ApprovalTime=DateTime.Now;
            pram.ApprovalContent = "";
            pram.EvaluationStaffId = Guid.Empty;
            pram.EvaluationTime = DateTime.Now;
            pram.RewardMoney = 0;
            pram.RewardType = 1;
            pram.Keyid = null;
            await  _SugarClient.InsertNav(pram).Include(x=>x.WorkPlanAttachments).ExecuteCommandAsync();
            return true;
        }
        /// <summary>
        /// 创建报销单
        /// </summary>
        /// <param name="pram"></param>
        /// <returns></returns>
        [LimitFilter(LimiType = Limttype.User, timespan = 10, ResponseMeg = "请勿在10秒内重复申请该接口")]
        public async Task<bool> EditOderAsync(OaWorkPlan pram)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            if (pram.WorkPlanAttachments?.Count > 0)
            {
                foreach (var item in pram.WorkPlanAttachments)
                {
                    if (item.AttachmentType <= 0 || item.AttachmentType > 3)
                        throw Oops.Oh("附件类型AttachmentType错误");
                    if (string.IsNullOrEmpty(item.PlanAttachment))
                    {
                        throw Oops.Oh("附件地址不能为空");
                    }
                    if(item.CreateTime==null)
                    item.CreateTime = DateTime.Now;
                    if (item.Operator == null)
                        item.Operator = Permissions.Name;
                }
            }
            //获取原始数据
            var data= await _SugarClient.Queryable<OaWorkPlan>().Includes(x=>x.WorkPlanAttachments).Includes(x=>x.OaWorkPlanShenpis).Where(x=>x.Keyid==pram.Keyid&&x.SentStaffId==Permissions.MemberId).FirstAsync();
            if(data==null)
                throw Oops.Oh("没有权限");
            if (data.ApprovalStatus != PlanStatusType.Uncommitted)
            {
                if (data.ApprovalStatus != PlanStatusType.unApproval || data.OaWorkPlanShenpis.Count > 0)
                {
                    if (data.HoubufapiaoStatus == HoubufapiaoStatusType.HouBuFaPiao && data.HoubufapiaoStatus == HoubufapiaoStatusType.HouBuFaPiao)
                    {
                        //后补发票,只能修改发票和附件
                        await _SugarClient.UpdateNav(data).Include(x => x.WorkPlanAttachments).ExecuteCommandAsync();
                        return true;
                    }
                    else
                        throw Oops.Oh("已经进入审批流程不可修改");
                }
            }
            if (data.RewardResult != pram.RewardResult)
            {
                try
                {
                    OaSubjectSet kemu = null;
                    var kemuid = pram.RewardResult.toInt();
                    kemu = _SugarClient.Queryable<OaSubjectSet>().Where(x => x.Keyid == kemuid && x.FirmId == _OAServices.firmId && x.SubjectType == "贷" && x.Status == true).First();
                    if (kemu == null)
                        throw Oops.Oh("科目选择错误,或者失效");
                    data.RewardResult = pram.RewardResult;
                    data.RewardContent = kemu.SubjectName;
                }
                catch (Exception)
                {
                    throw Oops.Oh("科目 RewardResult 选择错误,或者失效");
                }
            }
            if(data.ApprovalStatus== PlanStatusType.Uncommitted&&pram.ApprovalStatus== PlanStatusType.unApproval)
            {
                //重新提交必须修改新的单号
                data.EvaluationContent = _ezCoreNetRedisService.GetYYYMMddAnd4sn();
                data.ApprovalStatus = pram.ApprovalStatus;
            }
             data.PlanMoney=pram.PlanMoney;
            //摘要
             data.PlanContent =pram.PlanContent;
            //发票状态
              data.HoubufapiaoStatus = pram.HoubufapiaoStatus;
            //附件
              data.WorkPlanAttachments = pram.WorkPlanAttachments;
            data.LastUpdateTime = DateTime.Now;
             //data .PlanType 不可更改 =3
            await  _SugarClient.UpdateNav(data).Include(x => x.WorkPlanAttachments).ExecuteCommandAsync();
            return true;
        }
        /// <summary>
        /// 获取详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<OaWorkPlan> GetPlanInfo(int id)
        {
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            return await _SugarClient.Queryable<OaWorkPlan>().Includes(x=>x.SentStaff).Includes(x => x.OaWorkPlanShenpis,y=>y.ApprovalStaff).Includes(x=>x.Depart).Includes(x=>x.WorkPlanAttachments).Where(x => x.Keyid == id).FirstAsync();
        }
        /// <summary>
        /// 删除
        /// </summary>
        /// <returns></returns>
        [HttpDelete]
        public async Task<bool> DelOderAsync(int id )
        {
            if(id==0)
            {
                throw Oops.Oh("编号错误");
            }
            if (!await CheckRols())
            {
                throw Oops.Oh("没有权限");
            }
            //获取原始数据
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x => x.WorkPlanAttachments).Includes(x => x.OaWorkPlanShenpis).Where(x => x.Keyid == id && x.MemberId == Permissions.MemberId).FirstAsync();
            if (data == null)
                throw Oops.Oh("没找到申请");
            if (data.ApprovalStatus == PlanStatusType.Yes || data.OaWorkPlanShenpis.Count > 0)
            {
                throw Oops.Oh("已经进入审批流程不可修改");
            }
            await _SugarClient.DeleteNav(data).Include(x => x.WorkPlanAttachments).ExecuteCommandAsync();
            return true;
        }
        /// <summary>
        /// 判断是否具有权限
        /// </summary>
        /// <returns></returns>
        private async Task< bool> CheckRols()
        {
           var pr= await  _OAServices.GetOAPermissions();
            Permissions = pr ;
            if (pr != null &&pr.MemberId!=null)
            {
                return true;
            }
            else
                return false;
        }
    }
    /// <summary>
    /// //搜索参数
    /// </summary>
    public class SearchOaWorekPlan
    {
        /// <summary>
        /// 页面参数
        /// </summary>
        public PageModel page { get; set; }
        /// <summary>
        /// 员工姓名
        /// </summary>
        public string? StaffName { get; set; }
        /// <summary>
        /// 员工Id
        /// </summary>
        public Guid? StaffMemberIdId { get; set; }
        /// <summary>
        /// 状态 是否审批
        /// </summary>
        public PlanStatusType? ApprovalStatus { get; set; }
        /// <summary>
        /// 更正为报销状态
        /// </summary>
        public BaoxiaoStausType? EvaluationStatus { get; set; }
        /// <summary>
        /// 起始时间
        /// </summary>
        public DateTime? PlanStartTimeStart { get; set; }
        /// <summary>
        /// 结束时间
        /// </summary>
        public DateTime? PlanStartTimeEnd { get; set; }
        /// <summary>
        /// 类别,默认为17 只能为17
        /// </summary>
        public int? PlanDataType { get;  set; }
    }
    public class WorekPlandto
    {
        /// <summary>
        /// 数据
        /// </summary>
        public List< OaWorkPlan> list { get; set; }
        /// <summary>
        /// 页面统计
        /// </summary>
      public  PageModel page { get; set; }
        /// <summary>
        /// 统计
        /// </summary>
        public decimal TotalMoney { get; set; } = 0;
    }
}
cylsg/cylsg.Application/Users/Dtos/UserDto.cs
@@ -1,4 +1,5 @@
using System;
using cylsg.Model.utilityViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -57,7 +58,10 @@
        /// </summary>
        public UserCompanyDto userCompany { get; set; }
        /// <summary>
        /// 川印员工权限
        /// </summary>
        public ECTESTOAPermissions OAPermissions { get; set; }
    }
    public class UserWorkerDto
cylsg/cylsg.Application/Users/UserAppService.cs
@@ -10,6 +10,8 @@
using System.Security.Claims;
using System.Runtime.Intrinsics.Arm;
using MapsterMapper;
using ECTESTOA;
namespace cylsg.Application.Users
{
@@ -22,11 +24,15 @@
        private readonly ISystemService _systemService;
        private ISqlSugarClient _sqlSugarClient;
        private IMapper _mapper;
        public UserAppService(ISystemService systemService, ISqlSugarClient sqlSugarClient, IMapper mapper)
        private readonly IOAServices _OAServices;
        public UserAppService(ISystemService systemService, ISqlSugarClient sqlSugarClient, IMapper mapper
            ,IOAServices oAServices
            )
        {
            _systemService = systemService;
            _sqlSugarClient = sqlSugarClient;
            _mapper = mapper;
            _OAServices = oAServices;
        }
@@ -63,8 +69,8 @@
            {
                userDto.userCompany = _mapper.Map<UserCompanyDto>(userCompany);
            }
            //增加川印权限获取
            userDto.OAPermissions= await _OAServices.GetOAPermissions();
            return userDto;
cylsg/cylsg.Application/cylsg.Application.csproj
@@ -28,6 +28,7 @@
        <ProjectReference Include="..\cylsg.Model\cylsg.Model.csproj" />
        <ProjectReference Include="..\cylsg.redis\cylsg.redis.csproj" />
        <ProjectReference Include="..\cylsg.utility\cylsg.utility.csproj" />
        <ProjectReference Include="..\ECTESTOA\ECTESTOA.csproj" />
        <ProjectReference Include="..\EzInitqMessageDef\EzInitqMessageDef.csproj" />
        <ProjectReference Include="..\EzTencentCloud\EzTencentCloud.csproj" />
        <ProjectReference Include="..\EzUpFile\EzUpFile.csproj" />
cylsg/cylsg.Core/DbContext.cs
@@ -9,12 +9,28 @@
/// </summary>
public static class DbContext
{
    public static List<ConnectionConfig> connectionConfigs
    {
        get
        {
            var list = App.GetConfig<List<ConnectionConfig>>("ConnectionConfigs");
            foreach (var config in list)
            {
                config.ConfigureExternalServices = new ConfigureExternalServices()
                {
                    DataInfoCacheService = new SqlSugarRedisCache()
                };
            }
            return list;
        }
    }
    /// <summary>
    /// SqlSugar 数据库实例
    /// </summary>
    public static readonly SqlSugarScope Instance = new(
        // 读取 appsettings.json 中的 ConnectionConfigs 配置节点
        App.GetConfig<List<ConnectionConfig>>("ConnectionConfigs")
        //App.GetConfig<List<ConnectionConfig>>("ConnectionConfigs")
        connectionConfigs
        , db =>
        {
            // 这里配置全局事件,比如拦截执行 SQL
cylsg/cylsg.Core/SqlSugarRedisCache.cs
New file
@@ -0,0 +1,79 @@
using Furion;
using SqlSugar;
using SugarRedis;
//using SugarRedis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Core
{
    public class SqlSugarRedisCache : ICacheService
    {
        //NUGET安装 SugarRedis  (也可以自个实现)
        //注意:SugarRedis 不要扔到构造函数里面, 一定要单例模式
        public static SugarRedisClient _service = new SugarRedisClient(App.Configuration["RedisConfig:ConnectionString"] ?? "127.0.0.1:6379,password=,connectTimeout=3000,connectRetry=1,syncTimeout=10000,DefaultDatabase=0");
        //+1重载 new SugarRedisClient(字符串)
        //默认:127.0.0.1:6379,password=,connectTimeout=3000,connectRetry=1,syncTimeout=10000,DefaultDatabase=0
        public void Add<V>(string key, V value)
        {
            _service.Set(key, value);
        }
        public void Add<V>(string key, V value, int cacheDurationInSeconds)
        {
            _service.SetBySeconds(key, value, cacheDurationInSeconds);
        }
        public bool ContainsKey<V>(string key)
        {
            return _service.Exists(key);
        }
        public V Get<V>(string key)
        {
            return _service.Get<V>(key);
        }
        public IEnumerable<string> GetAllKey<V>()
        {
            //性能注意: 只查sqlsugar用到的key
            return _service.SearchCacheRegex("SqlSugarDataCache.*");
        }
        public V GetOrCreate<V>(string cacheKey, Func<V> create, int cacheDurationInSeconds = int.MaxValue)
        {
            if (this.ContainsKey<V>(cacheKey))
            {
                var result = this.Get<V>(cacheKey);
                if (result == null)
                {
                    return create();
                }
                else
                {
                    return result;
                }
            }
            else
            {
                var result = create();
                this.Add(cacheKey, result, cacheDurationInSeconds);
                return result;
            }
        }
        public void Remove<V>(string key)
        {
            _service.Remove(key);
        }
    }
}
cylsg/cylsg.Core/cylsg.Core.csproj
@@ -18,6 +18,7 @@
        <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.5.3" />
        <PackageReference Include="Furion.Pure" Version="4.9.5.3" />
        <PackageReference Include="SqlSugarCore" Version="5.1.4.166" />
        <PackageReference Include="SugarRedis" Version="1.5.0" />
    </ItemGroup>
    <ItemGroup>
cylsg/cylsg.Model/ECTEModel/OA_FirmAccount.cs
New file
@@ -0,0 +1,117 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace Models
{
    /// <summary>
    /// 办公系统厂商账户表
    ///</summary>
    [SugarTable("OA_FirmAccount")]
    [Tenant("ECTESTOADB")]
    public class OA_FirmAccount
    {
        /// <summary>
        /// 备  注:账户编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Keyid" ,IsPrimaryKey = true,IsIdentity = true) ]
        public int Keyid  { get; set;  }
        /// <summary>
        /// 备  注:厂商编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="FirmId" ) ]
        public Guid FirmId  { get; set;  }
        /// <summary>
        /// 备  注:账名
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="AccountName" ) ]
        public string AccountName  { get; set;  } = null!;
        /// <summary>
        /// 备  注:账户类型
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="AccountType" ) ]
        public string AccountType  { get; set;  } = null!;
        /// <summary>
        /// 备  注:户名
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="UserName" ) ]
        public string UserName  { get; set;  } = null!;
        /// <summary>
        /// 备  注:责任人
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="ResponsiblePerson" ) ]
        public string? ResponsiblePerson  { get; set;  }
        /// <summary>
        /// 备  注:状态
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Status" ) ]
        public bool Status  { get; set;  }
        /// <summary>
        /// 备  注:余额
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Balance" ) ]
        public decimal Balance  { get; set;  }
        /// <summary>
        /// 备  注:总收入
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="AllIncome" ) ]
        public decimal AllIncome  { get; set;  }
        /// <summary>
        /// 备  注:总支出
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="AllExpenses" ) ]
        public decimal AllExpenses  { get; set;  }
        /// <summary>
        /// 备  注:创建时间
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="CreateTime" ) ]
        public DateTime CreateTime  { get; set;  }
        /// <summary>
        /// 备  注:最后修改时间
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="LastUpdateTime" ) ]
        public DateTime LastUpdateTime  { get; set;  }
        /// <summary>
        /// 备  注:操作人
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Operator" ) ]
        public string Operator  { get; set;  } = null!;
        /// <summary>
        /// 备  注:备注
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Remark" ) ]
        public string? Remark  { get; set;  }
    }
}
cylsg/cylsg.Model/ECTEModel/OA_FirmAccountRecord.cs
New file
@@ -0,0 +1,103 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace Models
{
    /// <summary>
    /// 办公系统厂商账户收支记录
    ///</summary>
    [SugarTable("OA_FirmAccountRecord")]
    [Tenant("ECTESTOADB")]
    public class OA_FirmAccountRecord
    {
        /// <summary>
        /// 备  注:记录编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Keyid" ,IsPrimaryKey = true,IsIdentity = true) ]
        public int Keyid  { get; set;  }
        /// <summary>
        /// 备  注:科目编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="SubjectId" ) ]
        public int SubjectId  { get; set;  }
        /// <summary>
        /// 备  注:账户编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="AccountId" ) ]
        public int AccountId  { get; set;  }
        /// <summary>
        /// 备  注:收、支
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="RecordTypeId" ) ]
        public int RecordTypeId  { get; set;  }
        /// <summary>
        /// 备  注:操作金额
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Money" ) ]
        public decimal Money  { get; set;  }
        /// <summary>
        /// 备  注:名称
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="PaymentUnit" ) ]
        public string PaymentUnit  { get; set;  } = null!;
        /// <summary>
        /// 备  注:记录来源信息
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="OperationalMatters" ) ]
        public string OperationalMatters  { get; set;  } = null!;
        /// <summary>
        /// 备  注:最后修改时间
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="LastUpdateTime" ) ]
        public DateTime LastUpdateTime  { get; set;  }
        /// <summary>
        /// 备  注:操作人
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Operator" ) ]
        public string Operator  { get; set;  } = null!;
        /// <summary>
        /// 备  注:备注
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Remark" ) ]
        public string? Remark  { get; set;  }
        /// <summary>
        /// 备  注:
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="ResidualAmount" ) ]
        public decimal? ResidualAmount  { get; set;  }
        /// <summary>
        /// 备  注:
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="Department" ) ]
        public string? Department  { get; set;  }
    }
}
cylsg/cylsg.Model/ECTEModel/OA_FirmRole.cs
New file
@@ -0,0 +1,59 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 办公系统厂商员工角色表
    /// </summary>
    [SugarTable("OA_FirmRole")]
    [Tenant("ECTESTOADB")]
    public class OA_FirmRole
    {
        /// <summary>
        /// 信息编号
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Keyid { get; set; }
        /// <summary>
        /// 所属厂商编号
        /// </summary>
        [SugarColumn(IsNullable = false)]
        public Guid FirmId { get; set; }
        /// <summary>
        /// 角色名称
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDataType = "varchar(20)")]
        public string RoleName { get; set; }
        /// <summary>
        /// 是否有效
        /// </summary>
        [SugarColumn(IsNullable = false)]
        public bool IsUsed { get; set; }
        /// <summary>
        /// 最后修改时间
        /// </summary>
        [SugarColumn(IsNullable = false)]
        public DateTime LastUpdateTime { get; set; }
        /// <summary>
        /// 操作人
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDataType = "varchar(20)")]
        public string Operator { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(200)")]
        public string Remark { get; set; }
    }
}
cylsg/cylsg.Model/ECTEModel/OA_FirmRolePermissionsRel.cs
New file
@@ -0,0 +1,60 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace Models
{
    /// <summary>
    /// 办公系统厂商角色权限关联表
    ///</summary>
    [SugarTable("OA_FirmRolePermissionsRel")]
    public class OA_FirmRolePermissionsRel
    {
        /// <summary>
        /// 备  注:所属厂商编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="FirmId" ) ]
        public Guid? FirmId  { get; set;  }
        /// <summary>
        /// 备  注:角色编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="RoleId" ) ]
        public int RoleId  { get; set;  }
        /// <summary>
        /// 备  注:功能编号组
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="FuncGroup" ) ]
        public string? FuncGroup  { get; set;  }
        /// <summary>
        /// 备  注:一级菜单编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="MenuIdOne" ) ]
        public int? MenuIdOne  { get; set;  }
        /// <summary>
        /// 备  注:二级菜单编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="MenuIdTwo" ) ]
        public int? MenuIdTwo  { get; set;  }
        /// <summary>
        /// 备  注:三级菜单编号
        /// 默认值:
        ///</summary>
        [SugarColumn(ColumnName="MenuIdThree" ) ]
        public int? MenuIdThree  { get; set;  }
    }
}
cylsg/cylsg.Model/ECTEModel/OaDepartment.cs
New file
@@ -0,0 +1,61 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 厂商部门表
    /// </summary>
    [Tenant("ECTESTOADB")]
    [SugarTable("Oa_Department")]
    public class OaDepartment
        {
            /// <summary>
            /// 部门编号
            /// </summary>
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int Keyid { get; set; }
            /// <summary>
            /// 所属厂商编号
            /// </summary>
            [SugarColumn(ColumnName = "FirmId")]
            public Guid? FirmId { get; set; }
            /// <summary>
            /// 部门名称
            /// </summary>
            [SugarColumn(ColumnName = "Name", Length = 50)]
            public string Name { get; set; }
            /// <summary>
            /// 状态
            /// </summary>
            [SugarColumn(ColumnName = "Status", Length = 50)]
            public string Status { get; set; }
            /// <summary>
            /// 最后修改时间
            /// </summary>
            [SugarColumn(ColumnName = "LastUpdateTime")]
            public DateTime? LastUpdateTime { get; set; }
            /// <summary>
            /// 操作人
            /// </summary>
            [SugarColumn(ColumnName = "Operator", Length = 50)]
            public string Operator { get; set; }
            /// <summary>
            /// 备注
            /// </summary>
            [SugarColumn(ColumnName = "Remark", Length = 200)]
            public string Remark { get; set; }
        }
}
cylsg/cylsg.Model/ECTEModel/OaStaff.cs
New file
@@ -0,0 +1,384 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 办公系统员工表
    /// </summary>
    [Tenant( "ECTESTOADB")]
    [SugarTable("Oa_Staff")]
        public class OaStaff
        {
            /// <summary>
            /// 主键ID
            /// </summary>
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int Keyid { get; set; }
            /// <summary>
            /// 所属厂商编号
            /// </summary>
            [SugarColumn(ColumnName = "FirmId")]
            public Guid FirmId { get; set; }
            /// <summary>
            /// 姓名
            /// </summary>
            [SugarColumn(ColumnName = "Name", Length = 20)]
            public string Name { get; set; }
            /// <summary>
            /// 性别
            /// </summary>
            [SugarColumn(ColumnName = "Sex", Length = 4)]
            public string Sex { get; set; }
            /// <summary>
            /// 登录账号
            /// </summary>
            [SugarColumn(ColumnName = "StaffUserName", Length = 20)]
            public string StaffUserName { get; set; }
            /// <summary>
            /// 密码
            /// </summary>
            [SugarColumn(ColumnName = "StaffUserPwd", Length = 20)]
            public string StaffUserPwd { get; set; }
            /// <summary>
            /// 手机 ==对应用户ITCode
            /// </summary>
            [SugarColumn(ColumnName = "MobieNum", Length = 20)]
            public string MobieNum { get; set; }
            /// <summary>
            /// QQ
            /// </summary>
            [SugarColumn(ColumnName = "QQ", Length = 20)]
            public string QQ { get; set; }
            /// <summary>
            /// 联系电话
            /// </summary>
            [SugarColumn(ColumnName = "PhoneNum", Length = 20)]
            public string PhoneNum { get; set; }
            /// <summary>
            /// Email
            /// </summary>
            [SugarColumn(ColumnName = "Email", Length = 50)]
            public string Email { get; set; }
            /// <summary>
            /// 状态
            /// </summary>
            [SugarColumn(ColumnName = "Status", Length = 10)]
            public string Status { get; set; }
            /// <summary>
            /// 最后修改时间
            /// </summary>
            [SugarColumn(ColumnName = "LastUpdateTime")]
            public DateTime LastUpdateTime { get; set; }
            /// <summary>
            /// 操作人
            /// </summary>
            [SugarColumn(ColumnName = "Operator", Length = 20)]
            public string Operator { get; set; }
            /// <summary>
            /// 备注
            /// </summary>
            [SugarColumn(ColumnName = "Remark", Length = 200)]
            public string Remark { get; set; }
            /// <summary>
            /// 关联会员
            /// </summary>
            [SugarColumn(ColumnName = "MemberId")]
            public Guid? MemberId { get; set; }
            /// <summary>
            /// 是否为业务经理
            /// </summary>
            [SugarColumn(ColumnName = "IsBusinessManager")]
            public bool? IsBusinessManager { get; set; }
            /// <summary>
            /// 是否为账户经理
            /// </summary>
            [SugarColumn(ColumnName = "IsAccountManager")]
            public bool? IsAccountManager { get; set; }
            /// <summary>
            /// 部门ID
            /// </summary>
            [SugarColumn(ColumnName = "DepartmentId")]
            public int? DepartmentId { get; set; }
           /// <summary>
          /// 部门
          /// </summary>
           [Navigate(NavigateType.OneToOne,nameof( DepartmentId),nameof(OaDepartment.Keyid))]
            public OaDepartment Department { get; set; }
            /// <summary>
            /// 个人档案唯一编码
            /// </summary>
            [SugarColumn(ColumnName = "SM_Number", Length = 50)]
            public string SM_Number { get; set; }
            /// <summary>
            /// 爱人姓名
            /// </summary>
            [SugarColumn(ColumnName = "SM_SpouseName", Length = 50)]
            public string SM_SpouseName { get; set; }
            /// <summary>
            /// 爱人电话
            /// </summary>
            [SugarColumn(ColumnName = "SM_SpousePhone", Length = 50)]
            public string SM_SpousePhone { get; set; }
            /// <summary>
            /// 其他记录
            /// </summary>
            [SugarColumn(ColumnName = "SM_OtherLog")]
            public string SM_OtherLog { get; set; }
            /// <summary>
            /// 职务
            /// </summary>
            [SugarColumn(ColumnName = "SM_Post", Length = 50)]
            public string SM_Post { get; set; }
            /// <summary>
            /// 学历
            /// </summary>
            [SugarColumn(ColumnName = "SM_Degree", Length = 50)]
            public string SM_Degree { get; set; }
            /// <summary>
            /// 入职时间
            /// </summary>
            [SugarColumn(ColumnName = "SM_StartWorkTime")]
            public DateTime? SM_StartWorkTime { get; set; }
            /// <summary>
            /// 薪资待遇
            /// </summary>
            [SugarColumn(ColumnName = "SM_Money", Length = 100)]
            public string SM_Money { get; set; }
            /// <summary>
            /// 是否购买社保
            /// </summary>
            [SugarColumn(ColumnName = "SM_IsSocialSecurity")]
            public int? SM_IsSocialSecurity { get; set; }
            /// <summary>
            /// 社保类型
            /// </summary>
            [SugarColumn(ColumnName = "SM_SocialSecurityType", Length = 50)]
            public string SM_SocialSecurityType { get; set; }
            /// <summary>
            /// 社保卡号
            /// </summary>
            [SugarColumn(ColumnName = "SM_SocialSecurityNumber", Length = 50)]
            public string SM_SocialSecurityNumber { get; set; }
            /// <summary>
            /// 是否签订合同
            /// </summary>
            [SugarColumn(ColumnName = "SM_IsContract")]
            public int? SM_IsContract { get; set; }
            /// <summary>
            /// 合同签订时间
            /// </summary>
            [SugarColumn(ColumnName = "SM_ContractStartTime")]
            public DateTime? SM_ContractStartTime { get; set; }
            /// <summary>
            /// 合同到期时间
            /// </summary>
            [SugarColumn(ColumnName = "SM_ContractEndTime")]
            public DateTime? SM_ContractEndTime { get; set; }
            /// <summary>
            /// 离职审批
            /// </summary>
            [SugarColumn(ColumnName = "SM_EndWorkStatus")]
            public int? SM_EndWorkStatus { get; set; }
            /// <summary>
            /// 离职申请时间
            /// </summary>
            [SugarColumn(ColumnName = "SM_EndWorkStartTime")]
            public DateTime? SM_EndWorkStartTime { get; set; }
            /// <summary>
            /// 离职时间
            /// </summary>
            [SugarColumn(ColumnName = "SM_EndWorkTime")]
            public DateTime? SM_EndWorkTime { get; set; }
            /// <summary>
            /// 离职原因
            /// </summary>
            [SugarColumn(ColumnName = "SM_EndWorkContent", Length = 200)]
            public string SM_EndWorkContent { get; set; }
            /// <summary>
            /// 部门主管签字
            /// </summary>
            [SugarColumn(ColumnName = "SM_DepartmentHeads", Length = 50)]
            public string SM_DepartmentHeads { get; set; }
            /// <summary>
            /// 行政部签字
            /// </summary>
            [SugarColumn(ColumnName = "SM_AdministrationDepartment", Length = 50)]
            public string SM_AdministrationDepartment { get; set; }
            /// <summary>
            /// 财务部签字
            /// </summary>
            [SugarColumn(ColumnName = "SM_MinistryFinance", Length = 50)]
            public string SM_MinistryFinance { get; set; }
            /// <summary>
            /// 总经理签字
            /// </summary>
            [SugarColumn(ColumnName = "SM_GeneralManager", Length = 50)]
            public string SM_GeneralManager { get; set; }
            /// <summary>
            /// 是否导入
            /// </summary>
            [SugarColumn(ColumnName = "SM_IsImporting")]
            public int? SM_IsImporting { get; set; }
            /// <summary>
            /// 是否删除
            /// </summary>
            [SugarColumn(ColumnName = "SM_IsDelete")]
            public int? SM_IsDelete { get; set; }
            /// <summary>
            /// 出生日期
            /// </summary>
            [SugarColumn(ColumnName = "SM_Birthday")]
            public DateTime? SM_Birthday { get; set; }
            /// <summary>
            /// 身份证号码
            /// </summary>
            [SugarColumn(ColumnName = "SM_IDCardNum", Length = 50)]
            public string SM_IDCardNum { get; set; }
            /// <summary>
            /// 身份证图片
            /// </summary>
            [SugarColumn(ColumnName = "SM_IDCardPic", Length = 200)]
            public string SM_IDCardPic { get; set; }
            /// <summary>
            /// 证书类型
            /// </summary>
            [SugarColumn(ColumnName = "SM_CertificateType")]
            public string SM_CertificateType { get; set; }
            /// <summary>
            /// 证书图片
            /// </summary>
            [SugarColumn(ColumnName = "SM_CertificatePic")]
            public string SM_CertificatePic { get; set; }
            /// <summary>
            /// 现居省
            /// </summary>
            [SugarColumn(ColumnName = "SM_NowProvince", Length = 50)]
            public string SM_NowProvince { get; set; }
            /// <summary>
            /// 现居市
            /// </summary>
            [SugarColumn(ColumnName = "SM_NowCity", Length = 50)]
            public string SM_NowCity { get; set; }
            /// <summary>
            /// 现居区
            /// </summary>
            [SugarColumn(ColumnName = "SM_NowArea", Length = 50)]
            public string SM_NowArea { get; set; }
            /// <summary>
            /// 现居地址
            /// </summary>
            [SugarColumn(ColumnName = "SM_NowAddress", Length = 50)]
            public string SM_NowAddress { get; set; }
            /// <summary>
            /// 籍贯省
            /// </summary>
            [SugarColumn(ColumnName = "SM_OldProvence", Length = 50)]
            public string SM_OldProvence { get; set; }
            /// <summary>
            /// 籍贯市
            /// </summary>
            [SugarColumn(ColumnName = "SM_OldCity", Length = 50)]
            public string SM_OldCity { get; set; }
            /// <summary>
            /// 籍贯区
            /// </summary>
            [SugarColumn(ColumnName = "SM_OldArea", Length = 50)]
            public string SM_OldArea { get; set; }
            /// <summary>
            /// 籍贯地址
            /// </summary>
            [SugarColumn(ColumnName = "SM_OldAdress", Length = 50)]
            public string SM_OldAdress { get; set; }
            /// <summary>
            /// 是否是司机
            /// </summary>
            [SugarColumn(ColumnName = "BF_IsDriver")]
            public bool BF_IsDriver { get; set; }
            /// <summary>
            /// 是否是配送管理员
            /// </summary>
            [SugarColumn(ColumnName = "BF_IsDeliverManage")]
            public bool BF_IsDeliverManage { get; set; }
            /// <summary>
            /// 是否为报销主管
            /// </summary>
            [SugarColumn(ColumnName = "BF_IsBaoxiaozhuguan")]
            public bool BF_IsBaoxiaozhuguan { get; set; }
            /// <summary>
            /// 是否为报销经理
            /// </summary>
            [SugarColumn(ColumnName = "BF_Isbaoxiaojingli")]
            public bool BF_Isbaoxiaojingli { get; set; }
    }
}
cylsg/cylsg.Model/ECTEModel/OaStaffRoleRel.cs
New file
@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 员工角色表
    /// </summary>
    [Tenant("ECTESTOADB")]
    public class OA_StaffRoleRel
    {
        public Guid FirmId { get; set; }
        public int StaffId { get; set; }
        public int RoleId { get; set; }
    }
}
cylsg/cylsg.Model/ECTEModel/OaSubjectSet.cs
New file
@@ -0,0 +1,68 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 办公系统科目设置
    /// </summary>
    [Tenant("ECTESTOADB")]
    [SugarTable("Oa_SubjectSet")]
    public class OaSubjectSet
        {
            /// <summary>
            /// 科目编号
            /// </summary>
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int Keyid { get; set; }
            /// <summary>
            /// 所属厂商
            /// </summary>
            [SugarColumn(ColumnName = "FirmId")]
            public Guid? FirmId { get; set; }
            /// <summary>
            /// 科目类别 过滤为 贷是支出 的类别
            /// </summary>
            [SugarColumn(ColumnName = "SubjectType", Length = 10)]
            public string? SubjectType { get; set; }
            /// <summary>
            /// 科目名称
            /// </summary>
            [SugarColumn(ColumnName = "SubjectName", Length = 50)]
            public string SubjectName { get; set; }
            /// <summary>
            /// 最后修改时间
            /// </summary>
            [SugarColumn(ColumnName = "LastUpdateTime")]
            public DateTime? LastUpdateTime { get; set; }
            /// <summary>
            /// 操作人
            /// </summary>
            [SugarColumn(ColumnName = "Operator", Length = 20)]
            public string? Operator { get; set; }
            /// <summary>
            /// 备注
            /// </summary>
            [SugarColumn(ColumnName = "Remark", Length = 200)]
            public string? Remark { get; set; }
            /// <summary>
            /// 状态 1为有效
            /// </summary>
            [SugarColumn(ColumnName = "Status")]
            public bool? Status { get; set; }
        }
}
cylsg/cylsg.Model/ECTEModel/OaWorkPlan.cs
New file
@@ -0,0 +1,315 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 工作流程
    /// </summary>
    [Tenant("ECTESTOADB")]
    [SugarTable("OA_WorkPlan")]
    public  class  OaWorkPlan
        {
            /// <summary>
            /// 编号
            /// </summary>
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int? Keyid { get; set; }
            /// <summary>
            /// 会员编号
            /// </summary>
            [SugarColumn(ColumnName = "MemberId")]
            public Guid? MemberId { get; set; }
            /// <summary>
            /// 发起人编号
            /// </summary>
            [SugarColumn(ColumnName = "SentStaffId")]
            public Guid? SentStaffId { get; set; }
        /// <summary>
        /// 员工
        /// </summary>
        [Navigate(NavigateType.OneToOne, nameof(SentStaffId), nameof(OaStaff.MemberId))]
        public OaStaff? SentStaff { get; set; }
        /// <summary>
        /// 部门编号
        /// </summary>
        [SugarColumn(ColumnName = "DepartId")]
            public int? DepartId { get; set; }
          /// <summary>
          /// 部门
          /// </summary>
        [Navigate(NavigateType.OneToOne, nameof(DepartId), nameof(OaDepartment.Keyid))]
        public OaDepartment? Depart { get; set; }
        /// <summary>
        /// 接收人编号
        /// </summary>
        [SugarColumn(ColumnName = "ReciveStaffId")]
            public Guid? ReciveStaffId { get; set; }
            /// <summary>
            /// 计划类型  报销类为3
            /// </summary>
            [SugarColumn(ColumnName = "PlanType")]
            public int? PlanType { get; set; }
            /// <summary>
            /// 计划性质 报销类为17
            /// </summary>
            [SugarColumn(ColumnName = "PlanDataType")]
            public int? PlanDataType { get; set; }
            /// <summary>
            /// 主题 和内容一致
            /// </summary>
            [SugarColumn(ColumnName = "PlanTitle", Length = 200)]
            public string? PlanTitle { get; set; }
            /// <summary>
            /// 内容
            /// </summary>
            [SugarColumn(ColumnName = "PlanContent", Length = 500)]
            public string? PlanContent { get; set; }
            /// <summary>
            /// 执行时间
            /// </summary>
            [SugarColumn(ColumnName = "PlanRunTime")]
            public DateTime? PlanRunTime { get; set; }
            /// <summary>
            /// 申请费用
            /// </summary>
            [SugarColumn(ColumnName = "PlanMoney")]
            public decimal? PlanMoney { get; set; }
            /// <summary>
            /// 备注
            /// </summary>
            [SugarColumn(ColumnName = "PlanRemark", Length = 200)]
            public string? PlanRemark { get; set; }
            /// <summary>
            /// 计划添加时间
            /// </summary>
            [SugarColumn(ColumnName = "PlanStartTime")]
            public DateTime? PlanStartTime { get; set; }
            /// <summary>
            /// 计划人
            /// </summary>
            [SugarColumn(ColumnName = "PlanPeople", Length = 50)]
            public string? PlanPeople { get; set; }
            /// <summary>
            /// 对口单位
            /// </summary>
            [SugarColumn(ColumnName = "PlanComplany", Length = 50)]
            public string? PlanComplany { get; set; }
            /// <summary>
            /// 计划状态 未用
            /// </summary>
            [SugarColumn(ColumnName = "PlanStatus")]
            public PlanStatusType? PlanStatus { get; set; }
            /// <summary>
            /// 审核人编号
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalStaffId")]
            public Guid? ApprovalStaffId { get; set; }
        /// <summary>
        /// 审批状态
        /// </summary>
        [SugarColumn(ColumnName = "ApprovalStatus")]
        public PlanStatusType? ApprovalStatus { get; set; } = PlanStatusType.unApproval;
        /// <summary>
        /// 审批人员
        /// </summary>
        [Navigate(NavigateType.OneToMany,  nameof(OaWorkPlanShenpi.OA_WorkPlanId), nameof(Keyid))]
        public List<OaWorkPlanShenpi>? OaWorkPlanShenpis {  get; set; }
            /// <summary>
            /// 审核时间
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalTime")]
            public DateTime? ApprovalTime { get; set; }
            /// <summary>
            /// 审核批复
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalContent", Length = 100)]
            public string? ApprovalContent { get; set; }
            /// <summary>
            /// 最后修改时间
            /// </summary>
            [SugarColumn(ColumnName = "LastUpdateTime")]
            public DateTime? LastUpdateTime { get; set; }
            /// <summary>
            /// 操作人
            /// </summary>
            [SugarColumn(ColumnName = "Operator", Length = 20)]
            public string? Operator { get; set; }
        /// <summary>
        /// 考评结果/  更改为报销状态  默认为未报销状态
        /// </summary>
        [SugarColumn(ColumnName = "EvaluationStatus")]
        public BaoxiaoStausType? EvaluationStatus { get; set; } = BaoxiaoStausType.NotReimbursed;
            /// <summary>
            /// 考评内容// 变更为 报销单编号
            /// </summary>
            [SugarColumn(ColumnName = "EvaluationContent", Length = 200)]
            public string? EvaluationContent { get; set; }
            /// <summary>
            /// 考评人
            /// </summary>
            [SugarColumn(ColumnName = "EvaluationStaffId")]
            public Guid? EvaluationStaffId { get; set; }
            /// <summary>
            /// 考评时间
            /// </summary>
            [SugarColumn(ColumnName = "EvaluationTime")]
            public DateTime? EvaluationTime { get; set; }
            /// <summary>
            /// 奖励类型/当前步骤 ,1或者2
            /// </summary>
            [SugarColumn(ColumnName = "RewardType")]
            public int? RewardType { get; set; }
            /// <summary>
            /// 奖励原因 /为更正科目名称
            /// </summary>
            [SugarColumn(ColumnName = "RewardContent", Length = 200)]
            public string? RewardContent { get; set; }
        /// <summary>
        /// 奖励结果  /更正为科目ID
        /// </summary>
        [SugarColumn(ColumnName = "RewardResult", Length = 200)]
            public string? RewardResult { get; set; }
            /// <summary>
            /// 奖励金额 弃用
            /// </summary>
            [SugarColumn(ColumnName = "RewardMoney")]
            public decimal? RewardMoney { get; set; }
        /// <summary>
        /// 是否后补发票 默认为有发票
        /// </summary>
        public HoubufapiaoStatusType? HoubufapiaoStatus { get; set; } = HoubufapiaoStatusType.You;
        /// <summary>
        /// 附件,包括发票和附件,需要分类
        /// </summary>
        [Navigate(NavigateType.OneToMany,  nameof(OaWorkPlanAttachment.OA_WorkPlanId),nameof(Keyid))]
        public List< OaWorkPlanAttachment>? WorkPlanAttachments { get; set; }
        ///// <summary>
        ///// 单纯的附件
        ///// </summary>
        //[SugarColumn( IsIgnore =true)]
        //public List<OaWorkPlanAttachment>? Attachments { get; set; }
        ///// <summary>
        ///// 发票附件
        ///// </summary>
        //[SugarColumn(IsIgnore = true)]
        //public List<OaWorkPlanAttachment>? Receipts { get; set; }
        /// <summary>
        /// 报销账号
        /// </summary>
        [SugarColumn(IsIgnore =true)]
        public int? FirmAccountId {  get; set; }
    }
    public enum PlanStatusType
    {
        /// <summary>
        /// 申请
        /// </summary>
        [Description("未审批")]
        unApproval,
        /// <summary>
        /// 通过
        /// </summary>
        [Description("通过")]
        Yes ,
        /// <summary>
        /// 否定
        /// </summary>
        [Description("否定")]
        No,
        /// <summary>
        ///
        /// </summary>
        [Description("未提交")]
        Uncommitted
    }
    /// <summary>
    /// 后补发票状态
    /// </summary>
    public enum HoubufapiaoStatusType
    {
        /// <summary>
        /// 未知
        /// </summary>
        [Description("未知")]
        Unknown,
        /// <summary>
        /// 是
        /// </summary>
          [Description("是")]
        You = 1,
        /// <summary>
        ///后补发票
        /// </summary>
        [Description("后补发票")]
        HouBuFaPiao =2,
        /// <summary>
        /// 无发票
        /// </summary>
        [Description("无发票")]
        Wu = 3
    }
    public enum BaoxiaoStausType
    {
        /// <summary>
        /// 未知
        /// </summary>
        [Description("未知")]
        Unknown,
        /// <summary>
        /// 已报销
        /// </summary>
        [Description("已报销")]
        Reimbursed,
        /// <summary>
        /// 未报销
        /// </summary>
        [Description("未报销")]
        NotReimbursed
    }
}
cylsg/cylsg.Model/ECTEModel/OaWorkPlanAttachment.cs
New file
@@ -0,0 +1,55 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 工作计划附件表
    /// </summary>
    [Tenant("ECTESTOADB")]
    [SugarTable("Oa_WorkPlan_Attachment")]
    public class OaWorkPlanAttachment
        {
            /// <summary>
            /// 主键ID
            /// </summary>
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int? Keyid { get; set; }
            /// <summary>
            /// 工作计划ID
            /// </summary>
            [SugarColumn(ColumnName = "OA_WorkPlanId")]
            public int? OA_WorkPlanId { get; set; }
            /// <summary>
            /// 附件
            /// </summary>
            [SugarColumn(ColumnName = "PlanAttachment", Length = 500)]
            public string? PlanAttachment { get; set; }
        /// <summary>
        /// 附件类型   1是发票 2 是附件
        /// </summary>
        [SugarColumn(ColumnName = "AttachmentType")]
            public int? AttachmentType { get; set; }
            /// <summary>
            /// 创建时间
            /// </summary>
            [SugarColumn(ColumnName = "CreateTime")]
            public DateTime? CreateTime { get; set; }
            /// <summary>
            /// 操作员
            /// </summary>
            [SugarColumn(ColumnName = "Operator", Length = 20)]
            public string? Operator { get; set; }
        }
}
cylsg/cylsg.Model/ECTEModel/OaWorkPlanShenpi.cs
New file
@@ -0,0 +1,98 @@
using Mapster;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 工作计划审批表
    /// </summary>
    [Tenant("ECTESTOADB")]
    [SugarTable("Oa_WorkPlan_shenpi")]
    public class OaWorkPlanShenpi
        {
            /// <summary>
            /// 主键ID
            /// </summary>
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int? Keyid { get; set; }
            /// <summary>
            /// 工作计划ID 报销单ID
            /// </summary>
            [SugarColumn(ColumnName = "OA_WorkPlanId")]
            public int? OA_WorkPlanId { get; set; }
            /// <summary>
            /// 审批人编号
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalStaffId")]
            public Guid? ApprovalStaffId { get; set; }
        /// <summary>
        /// 审批人
        /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(ApprovalStaffId), nameof(OaStaff.MemberId))]
          public OaStaff? ApprovalStaff {  get; set; }
            /// <summary>
            /// 审批状态
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalStatus")]
        [Required]
        public PlanStatusType? ApprovalStatus { get; set; }
            /// <summary>
            /// 审批时间
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalTime")]
            public DateTime? ApprovalTime { get; set; }
            /// <summary>
            /// 审批内容
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalContent", Length = 100)]
            public string ApprovalContent { get; set; }
            /// <summary>
            /// 创建时间
            /// </summary>
            [SugarColumn(ColumnName = "CreateTime")]
            public DateTime CreateTime { get; set; }
            /// <summary>
            /// 操作员
            /// </summary>
            [SugarColumn(ColumnName = "Operator", Length = 20)]
            public string Operator { get; set; }
            /// <summary>
            /// 审批步骤
            /// </summary>
            [SugarColumn(ColumnName = "Buzhou")]
            public int? Buzhou { get; set; }
        /// <summary>
        /// 审批时传递科目ID
        /// </summary>
        [SugarColumn( IsIgnore= true)]
        public string? RewardResult { get; set; }
        /// <summary>
        /// 审批时传递摘要
        /// </summary>
        [SugarColumn(IsIgnore = true)]
        public string? PlanContent { get; set; }
        /// <summary>
        /// 审批时传递金额
        /// </summary>
        [SugarColumn(IsIgnore = true)]
        public decimal? PlanMoney { get; set; }
    }
}
cylsg/cylsg.Model/ECTEModel/Sys_Permissions_Menu.cs
New file
@@ -0,0 +1,77 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
    /// 系统权限菜单表
    /// </summary>
    [TenantAttribute("ECTESTOADB")]
    public class Sys_Permissions_Menu
    {
        /// <summary>
        /// 信息编号
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Keyid { get; set; }
        /// <summary>
        /// 菜单名称
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDataType = "nvarchar(50)")]
        public string MenuName { get; set; }
        /// <summary>
        /// 父菜单ID
        /// </summary>
        [SugarColumn(IsNullable = true)]
        public int? ParentId { get; set; }
        /// <summary>
        /// 菜单路径
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(200)")]
        public string MenuPath { get; set; }
        /// <summary>
        /// 菜单图标
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(200)")]
        public string MenuIcon { get; set; }
        /// <summary>
        /// 是否有效
        /// </summary>
        [SugarColumn(IsNullable = false)]
        public bool IsUsed { get; set; }
        /// <summary>
        /// 排序码
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(5)")]
        public string OrderCode { get; set; }
        /// <summary>
        /// 最后修改时间
        /// </summary>
        [SugarColumn(IsNullable = false)]
        public DateTime LastUpdateTime { get; set; }
        /// <summary>
        /// 操作人
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDataType = "varchar(20)")]
        public string Operator { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(200)")]
        public string Remark { get; set; }
    }
}
cylsg/cylsg.Model/ECTEModel/Sys_Permissions_RoleMenuRelation.cs
New file
@@ -0,0 +1,47 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.ECTEModel
{
    /// <summary>
      /// 系统权限角色菜单关系表
      /// </summary>
    [SugarTable("Sys_Permissions_RoleMenuRelation")]
    [Tenant("ECTESTOADB")]
    public class Sys_Permissions_RoleMenuRelation
    {
        /// <summary>
        /// 角色ID
        /// </summary>
        [SugarColumn(IsNullable = true)]
        public int? RoleId { get; set; }
        /// <summary>
        /// 功能ID
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(200)")]
        public string FuncId { get; set; }
        /// <summary>
        /// 一级菜单ID
        /// </summary>
        [SugarColumn(IsNullable = true)]
        public int? MenuIdOne { get; set; }
        /// <summary>
        /// 二级菜单ID
        /// </summary>
        [SugarColumn(IsNullable = true)]
        public int? MenuIdTwo { get; set; }
        /// <summary>
        /// 三级菜单ID
        /// </summary>
        [SugarColumn(IsNullable = true)]
        public int? MenuIdThree { get; set; }
    }
}
cylsg/cylsg.Model/utilityViewModel/ECTESTOAPermissions.cs
New file
@@ -0,0 +1,78 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cylsg.Model.utilityViewModel
{
    /// <summary>
    /// 川印权限模型
    /// </summary>
    public class ECTESTOAPermissions
    {
        /// <summary>
        /// 是否是司机
        /// </summary>
        public bool BF_IsDriver { get; set; }=false;
        /// <summary>
        /// 是否是配送管理员
        /// </summary>
        public bool BF_IsDeliverManage { get; set; } = false;
        /// <summary>
        /// 是否为报销主管
        /// </summary>
        public bool BF_IsBaoxiaozhuguan { get; set; } =false;
        /// <summary>
        /// 是否为报销经理
        /// </summary>
        public bool BF_Isbaoxiaojingli { get; set; } = false;
        /// <summary>
        /// 财务
        /// </summary>
        public bool BF_IsCaiWu{ get; set; } = false;
        /// <summary>
        /// 员工ID
        /// </summary>
        public Guid? MemberId { get; set; }
        /// <summary>
        /// 员工KeyID
        /// </summary>
        public int KeyId { get; set; }
        /// <summary>
        /// 员工姓名
        /// </summary>
        public string? Name {  get; set; }
        /// <summary>
        /// 员工电话
        /// </summary>
        public string? MobieNum { get; set; }
        /// <summary>
        /// 职务名称
        /// </summary>
        public string? SM_Post { get; set; }
        /// <summary>
        /// 部门名称
        /// </summary>
        public string? DepartmentName {  get; set; }
        /// <summary>
        /// 部门名称
        /// </summary>
        public int ? DepartId { get; set; }
    }
}
cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj
@@ -16,6 +16,7 @@
    <ItemGroup>
        <ProjectReference Include="..\cylsg.Application\cylsg.Application.csproj" />
        <ProjectReference Include="..\cylsg.Authorization\cylsg.Authorization.csproj" />
        <ProjectReference Include="..\ECTESTOA\ECTESTOA.csproj" />
        <ProjectReference Include="..\EzInitqMessageDef\EzInitqMessageDef.csproj" />
        <ProjectReference Include="..\EzInitQ\EzInitQ.csproj" />
        <ProjectReference Include="..\EzJob\EzJob.csproj" />
cylsg/cylsg.Web.Entry/appsettings.json
@@ -11,8 +11,8 @@
      "FileName": "application.log", // 日志文件完整路径或文件名,推荐 .log 作为拓展名
      "Append": true, // 追加到已存在日志文件或覆盖它们
      "MinimumLevel": "Information", // 最低日志记录级别
      "FileSizeLimitBytes": 0, // 控制每一个日志文件最大存储大小,单位是 B,也就是 1024 才等于 1KB,默认无限制,如果指定了该值,那么日志文件大小超出了该配置就会创建新的日志文件,新创建的日志文件命名规则:文件名+[递增序号].log
      "MaxRollingFiles": 0 // 控制最大创建的日志文件数量,默认无限制,配合 FileSizeLimitBytes 使用,如果指定了该值,那么超出该值将从最初日志文件中从头写入覆盖
      "FileSizeLimitBytes": 1024, // 控制每一个日志文件最大存储大小,单位是 B,也就是 1024 才等于 1KB,默认无限制,如果指定了该值,那么日志文件大小超出了该配置就会创建新的日志文件,新创建的日志文件命名规则:文件名+[递增序号].log
      "MaxRollingFiles": 10 // 控制最大创建的日志文件数量,默认无限制,配合 FileSizeLimitBytes 使用,如果指定了该值,那么超出该值将从最初日志文件中从头写入覆盖
    }
  },
  "AllowedHosts": "*",
@@ -27,8 +27,19 @@
      "DbType": "SqlServer", // "SqlServer" ,mysql,
      "IsAutoCloseConnection": true
    }
    ,
    {
      //"ConnectionString": "Data Source=./Furion.db",
      //"DbType": "Sqlite",
      //"IsAutoCloseConnection": true
      "ConnectionString": "Server=192.168.0.31;Database=ECTEST; MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;User Id=SA;Password=123456;",
      "DbType": "SqlServer", // "SqlServer" ,mysql,
      "IsAutoCloseConnection": true,
      "ConfigId": "ECTESTOADB"
    }
  ],
@@ -47,9 +58,9 @@
    "ValidateAudience": true, // 是否验证签收方,bool 类型,默认true
    "ValidAudience": "www.51zhengcai.com", // 签收方,string 类型
    "ValidateLifetime": true, // 是否验证过期时间,bool 类型,默认true,建议true
    "ExpiredTime": 1440, // 过期时间,long 类型,单位分钟,默认20分钟
    "ExpiredTime": 14400, // 过期时间,long 类型,单位分钟,默认20分钟
    "ClockSkew": 5, // 过期时间容错值,long 类型,单位秒,默认 5秒
    "Algorithm": "HS256", // 加密算法,string 类型,默认 HS256
    "RefreshTokenExpires": 1440 //分钟 1天 1440分钟
    "RefreshTokenExpires": 14400 //分钟 1天 1440分钟
  }
}
cylsg/cylsg.Web.Entry/cylsg.Web.Entry.csproj
@@ -12,6 +12,7 @@
    <ItemGroup>
        <ProjectReference Include="..\cylsg.Web.Core\cylsg.Web.Core.csproj" />
        <ProjectReference Include="..\ECTESTOA\ECTESTOA.csproj" />
        <ProjectReference Include="..\EzWechat\EzWechat.csproj" />
    </ItemGroup>
cylsg/cylsg.redis/EzCoreNetRedisService.cs
@@ -121,6 +121,22 @@
            return re;
        }
        public string GetYYYMMddAnd4sn()
        {
            string formattedDate = DateTime.Now.ToString("yyyyMMdd");
            var sn = Incrby($"CreatYYYMMddAnd4snKey:{formattedDate}");
            if (sn < 1)
            {
                //设置有效期限为24小时
                SetTtl($"CreatYYYMMddAnd4snKey:{formattedDate}", 24 * 60 * 60);
            }
            string re =   formattedDate + sn.ToString("D4");
            return re;
        }
        /// <summary>
        ///
        /// </summary>
cylsg/cylsg.redis/IEzCoreNetRedisService.cs
@@ -87,6 +87,11 @@
        /// </summary>
        string Get32sn();
        /// <summary>
        /// 获取yyymmdd +4位流水号
        /// </summary>
        /// <returns></returns>
         string GetYYYMMddAnd4sn();
        /// <summary>
        /// 设置锁
        /// </summary>
        /// <param name="LockKey"> 锁Key</param>
cylsg/cylsg.sln
@@ -33,7 +33,9 @@
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cylsg.Filter", "Cylsg.Filter\Cylsg.Filter.csproj", "{2A3AF5AA-E3BE-4C98-A3A7-185ED6F938FE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzJob", "EzJob\EzJob.csproj", "{EB4CED81-7245-4477-9541-8167BD522CC6}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EzJob", "EzJob\EzJob.csproj", "{EB4CED81-7245-4477-9541-8167BD522CC6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECTESTOA", "ECTESTOA\ECTESTOA.csproj", "{86D67CBF-50F3-470E-A11F-CAA3DF491995}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -105,6 +107,10 @@
        {EB4CED81-7245-4477-9541-8167BD522CC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {EB4CED81-7245-4477-9541-8167BD522CC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {EB4CED81-7245-4477-9541-8167BD522CC6}.Release|Any CPU.Build.0 = Release|Any CPU
        {86D67CBF-50F3-470E-A11F-CAA3DF491995}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {86D67CBF-50F3-470E-A11F-CAA3DF491995}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {86D67CBF-50F3-470E-A11F-CAA3DF491995}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {86D67CBF-50F3-470E-A11F-CAA3DF491995}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE