using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using NCC.ClayObject;
using NCC.Common.Configuration;
using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
using NCC.Common.Helper;
using NCC.Common.Model.NPOI;
using NCC.DataEncryption;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.Extend.Entitys.Dto.LqHytkHytk;
using NCC.Extend.Entitys.Dto.LqHytkJksyj;
using NCC.Extend.Entitys.Dto.LqHytkKjbsyj;
using NCC.Extend.Entitys.Dto.LqHytkMx;
using NCC.Extend.Entitys.lq_hytk_hytk;
using NCC.Extend.Entitys.lq_hytk_jksyj;
using NCC.Extend.Entitys.lq_hytk_kjbsyj;
using NCC.Extend.Entitys.lq_hytk_mx;
using NCC.Extend.Interfaces.LqHytkHytk;
using NCC.FriendlyException;
using NCC.JsonSerialization;
using SqlSugar;
using Yitter.IdGenerator;
namespace NCC.Extend.LqHytkHytk
{
///
/// 退卡_信息表服务
///
[ApiDescriptionSettings(Tag = "绿纤退卡信息表服务", Name = "LqHytkHytk", Order = 200)]
[Route("api/Extend/[controller]")]
public class LqHytkHytkService : ILqHytkHytkService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _lqHytkHytkRepository;
private readonly ISqlSugarRepository _lqHytkMxRepository;
private readonly ISqlSugarRepository _lqHytkJksyjRepository;
private readonly ISqlSugarRepository _lqHytkKjbsyjRepository;
private readonly SqlSugarScope _db;
private readonly IUserManager _userManager;
///
/// 初始化一个类型的新实例
///
public LqHytkHytkService(
ISqlSugarRepository lqHytkHytkRepository,
ISqlSugarRepository lqHytkMxRepository,
ISqlSugarRepository lqHytkJksyjRepository,
ISqlSugarRepository lqHytkKjbsyjRepository,
IUserManager userManager
)
{
_lqHytkHytkRepository = lqHytkHytkRepository;
_lqHytkMxRepository = lqHytkMxRepository;
_lqHytkJksyjRepository = lqHytkJksyjRepository;
_lqHytkKjbsyjRepository = lqHytkKjbsyjRepository;
_db = _lqHytkHytkRepository.Context;
_userManager = userManager;
}
#region 获取退卡信息列表
///
/// 获取退卡信息列表
///
/// 查询参数
///
[HttpGet("")]
public async Task GetList([FromQuery] LqHytkHytkListQueryInput input)
{
var sidx = input.sidx == null ? "id" : input.sidx;
List queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject>() : null;
DateTime? startTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.First()) : null;
DateTime? endTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.Last()) : null;
var data = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Equals(input.md))
.WhereIF(!string.IsNullOrEmpty(input.mdbh), p => p.Mdbh.Contains(input.mdbh))
.WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc))
.WhereIF(!string.IsNullOrEmpty(input.hy), p => p.Hy.Equals(input.hy))
.WhereIF(!string.IsNullOrEmpty(input.hymc), p => p.Hymc.Contains(input.hymc))
.WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh))
.WhereIF(!string.IsNullOrEmpty(input.gklx), p => p.Gklx.Contains(input.gklx))
.WhereIF(input.tkje.HasValue, p => p.Tkje == input.tkje)
.WhereIF(input.sgfy.HasValue, p => p.Sgfy == input.sgfy)
.WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
.WhereIF(!string.IsNullOrEmpty(input.tkzt), p => p.Tkzt.Contains(input.tkzt))
.WhereIF(!string.IsNullOrEmpty(input.tkyy), p => p.Tkyy.Contains(input.tkyy))
.WhereIF(!string.IsNullOrEmpty(input.fileUrl), p => p.FileUrl.Contains(input.fileUrl))
.WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0))
.WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.czry), p => p.Czry.Equals(input.czry))
.Select(it => new LqHytkHytkListOutput
{
id = it.Id,
md = it.Md,
mdbh = it.Mdbh,
mdmc = it.Mdmc,
hy = it.Hy,
hymc = it.Hymc,
hyzh = it.Hyzh,
gklx = it.Gklx,
tkje = it.Tkje,
sgfy = it.Sgfy,
bz = it.Bz,
tkzt = it.Tkzt,
tkyy = it.Tkyy,
tksj = it.Tksj,
czry = it.Czry,
fileUrl = it.FileUrl,
})
.MergeTable()
.OrderBy(sidx + " " + input.sort)
.ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult.SqlSugarPageResult(data);
}
#endregion
#region 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
///
/// 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
///
///
/// 创建退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
///
/// 示例请求:
/// ```json
/// {
/// "md": "门店ID",
/// "mdbh": "门店编号",
/// "mdmc": "门店名称",
/// "hy": "会员ID",
/// "hymc": "会员姓名",
/// "hyzh": "会员账号",
/// "gklx": "顾客类型",
/// "tkje": 1000.00,
/// "sgfy": 50.00,
/// "bz": "备注",
/// "tkzt": "退卡状态",
/// "tkyy": "退卡原因",
/// "lqHytkMxList": [
/// {
/// "px": "品项编号",
/// "pxmc": "品项名称",
/// "pxjg": 100.00,
/// "tkje": 100.00,
/// "F_ProjectNumber": 1,
/// "F_SourceType": "来源类型",
/// "F_TotalPrice": 100.00,
/// "lqHytkJksyjList": [
/// {
/// "jks": "健康师",
/// "jksxm": "健康师姓名",
/// "jkszh": "健康师账号",
/// "jksyj": 50.00,
/// "F_jsjid": "金三角ID",
/// "F_tkpxid": "项目资料ID",
/// "F_LaborCost": 10.00,
/// "F_tkpxNumber": 1
/// }
/// ],
/// "lqHytkKjbsyjList": [
/// {
/// "kjbls": "科技部老师",
/// "kjblsxm": "科技部老师姓名",
/// "kjblszh": "科技部老师账号",
/// "kjblsyj": 30.00,
/// "F_tkpxid": "项目资料ID",
/// "F_LaborCost": 5.00,
/// "F_tkpxNumber": 1
/// }
/// ]
/// }
/// ]
/// }
/// ```
///
/// 参数说明:
/// - md: 门店ID
/// - hy: 会员ID
/// - lqHytkMxList: 退卡品项明细列表
///
/// 退卡创建参数
/// 无返回值
/// 创建成功
/// 参数错误或数据验证失败
/// 服务器内部错误
[HttpPost("")]
public async Task Create([FromBody] LqHytkHytkCrInput input)
{
var userInfo = await _userManager.GetUserInfo();
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
entity.F_CreateTime = DateTime.Now;
entity.F_CreateUser = userInfo.userId;
entity.F_DeleteMark = 0;
entity.Czry = userInfo.userId;
try
{
// 开启事务
_db.BeginTran();
// 新增退卡主表记录
var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync();
// 收集所有需要插入的实体,然后批量插入
var allMxEntities = new List();
var allJksyjEntities = new List();
var allKjbsyjEntities = new List();
// 处理品项明细列表
if (input.lqHytkMxList != null && input.lqHytkMxList.Any())
{
foreach (var item in input.lqHytkMxList)
{
// 创建品项明细实体
var lqHytkMxEntity = new LqHytkMxEntity
{
Id = YitIdHelper.NextId().ToString(),
RefundInfoId = newEntity.Id,
BillingItemId = item.billingItemId,
CreateTime = DateTime.Now,
CreateUser = userInfo.userId,
DeleteMark = 0,
Px = item.px,
Pxmc = item.pxmc,
Pxjg = item.pxjg,
Tkje = item.tkje,
ProjectNumber = item.F_ProjectNumber ?? 1,
IsEnabled = item.F_IsEnabled ?? 1,
SourceType = item.F_SourceType,
TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
};
allMxEntities.Add(lqHytkMxEntity);
// 收集该品项关联的健康师业绩
if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any())
{
foreach (var ijks_tem in item.lqHytkJksyjList)
{
allJksyjEntities.Add(
new LqHytkJksyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Gltkbh = newEntity.Id,
Jks = ijks_tem.jks,
Jksxm = ijks_tem.jksxm,
Jkszh = ijks_tem.jkszh,
Jksyj = ijks_tem.jksyj,
Tksj = DateTime.Now,
F_jsjid = ijks_tem.F_jsjid,
F_tkpxid = ijks_tem.F_tkpxid,
F_LaborCost = ijks_tem.F_LaborCost,
F_tkpxNumber = ijks_tem.F_tkpxNumber,
F_CreateTime = DateTime.Now,
F_CreateUser = userInfo.userId,
F_DeleteMark = 0,
CardReturn = lqHytkMxEntity.Id,
}
);
}
}
// 收集该品项关联的科技部老师业绩
if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any())
{
foreach (var ikjbs_tem in item.lqHytkKjbsyjList)
{
allKjbsyjEntities.Add(
new LqHytkKjbsyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Gltkbh = newEntity.Id,
Kjbls = ikjbs_tem.kjbls,
Kjblsxm = ikjbs_tem.kjblsxm,
Kjblszh = ikjbs_tem.kjblszh,
Kjblsyj = ikjbs_tem.kjblsyj,
Tksj = DateTime.Now,
F_tkpxid = ikjbs_tem.F_tkpxid,
F_LaborCost = ikjbs_tem.F_LaborCost,
F_tkpxNumber = ikjbs_tem.F_tkpxNumber,
F_CreateTime = DateTime.Now,
F_CreateUser = userInfo.userId,
F_DeleteMark = 0,
CardReturn = lqHytkMxEntity.Id,
}
);
}
}
}
}
// 批量插入品项明细
if (allMxEntities.Any())
{
await _db.Insertable(allMxEntities).ExecuteCommandAsync();
}
// 批量插入健康师业绩
if (allJksyjEntities.Any())
{
await _db.Insertable(allJksyjEntities).ExecuteCommandAsync();
}
// 批量插入科技部老师业绩
if (allKjbsyjEntities.Any())
{
await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync();
}
// 关闭事务
_db.CommitTran();
}
catch (Exception ex)
{
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1005, ex.Message);
}
}
#endregion
#region 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
///
/// 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
///
///
/// 更新退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
/// 先删除原有的关联数据,再插入新的数据
///
/// 退卡ID
/// 退卡更新参数
/// 无返回值
/// 更新成功
/// 参数错误或数据验证失败
/// 服务器内部错误
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] LqHytkHytkUpInput input)
{
var userInfo = await _userManager.GetUserInfo();
var entity = input.Adapt();
entity.Id = id;
entity.F_ModifyTime = DateTime.Now;
entity.F_ModifyUser = userInfo.userId;
try
{
// 开启事务
_db.BeginTran();
// 更新退卡主表记录
await _db.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync();
// 删除原有的关联数据
await _db.Deleteable().Where(x => x.RefundInfoId == id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
// 收集所有需要插入的实体,然后批量插入
var allMxEntities = new List();
var allJksyjEntities = new List();
var allKjbsyjEntities = new List();
// 处理品项明细列表
if (input.lqHytkMxList != null && input.lqHytkMxList.Any())
{
foreach (var item in input.lqHytkMxList)
{
// 创建品项明细实体
var lqHytkMxEntity = new LqHytkMxEntity
{
Id = YitIdHelper.NextId().ToString(),
RefundInfoId = id,
BillingItemId = item.billingItemId,
CreateTime = DateTime.Now,
CreateUser = userInfo.userId,
DeleteMark = 0,
Px = item.px,
Pxmc = item.pxmc,
Pxjg = item.pxjg,
Tkje = item.tkje,
ProjectNumber = item.F_ProjectNumber ?? 1,
IsEnabled = item.F_IsEnabled ?? 1,
SourceType = item.F_SourceType,
TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
};
allMxEntities.Add(lqHytkMxEntity);
// 收集该品项关联的健康师业绩
if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any())
{
foreach (var ijks_tem in item.lqHytkJksyjList)
{
allJksyjEntities.Add(
new LqHytkJksyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Gltkbh = id,
Jks = ijks_tem.jks,
Jksxm = ijks_tem.jksxm,
Jkszh = ijks_tem.jkszh,
Jksyj = ijks_tem.jksyj,
Tksj = DateTime.Now,
F_jsjid = ijks_tem.F_jsjid,
F_tkpxid = ijks_tem.F_tkpxid,
F_LaborCost = ijks_tem.F_LaborCost,
F_tkpxNumber = ijks_tem.F_tkpxNumber,
F_CreateTime = DateTime.Now,
F_CreateUser = userInfo.userId,
F_DeleteMark = 0,
}
);
}
}
// 收集该品项关联的科技部老师业绩
if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any())
{
foreach (var ikjbs_tem in item.lqHytkKjbsyjList)
{
allKjbsyjEntities.Add(
new LqHytkKjbsyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Gltkbh = id,
Kjbls = ikjbs_tem.kjbls,
Kjblsxm = ikjbs_tem.kjblsxm,
Kjblszh = ikjbs_tem.kjblszh,
Kjblsyj = ikjbs_tem.kjblsyj,
Tksj = DateTime.Now,
F_tkpxid = ikjbs_tem.F_tkpxid,
F_LaborCost = ikjbs_tem.F_LaborCost,
F_tkpxNumber = ikjbs_tem.F_tkpxNumber,
F_CreateTime = DateTime.Now,
F_CreateUser = userInfo.userId,
F_DeleteMark = 0,
}
);
}
}
}
}
// 批量插入品项明细
if (allMxEntities.Any())
{
await _db.Insertable(allMxEntities).ExecuteCommandAsync();
}
// 批量插入健康师业绩
if (allJksyjEntities.Any())
{
await _db.Insertable(allJksyjEntities).ExecuteCommandAsync();
}
// 批量插入科技部老师业绩
if (allKjbsyjEntities.Any())
{
await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync();
}
// 关闭事务
_db.CommitTran();
}
catch (Exception ex)
{
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1005, ex.Message);
}
}
#endregion
#region 删除退卡信息
///
/// 删除退卡信息
///
/// 主键
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
if (entity != null)
{
entity.F_DeleteMark = 1;
await _lqHytkHytkRepository.UpdateAsync(entity);
}
}
#endregion
#region 获取退卡信息详情
///
/// 获取退卡信息详情
///
///
/// 获取退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
/// 按照退卡的完整格式返回数据,不包含汇总信息
///
/// 返回数据结构:
/// - 主表信息:退卡基础信息、门店信息、会员信息、退卡金额等
/// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等)
/// - 健康师业绩列表:按品项关联的健康师业绩信息
/// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息
///
/// 退卡记录主键ID
/// 退卡记录完整信息
/// 查询成功
/// 退卡记录不存在
/// 服务器内部错误
[HttpGet("{id}")]
public async Task GetInfo(string id)
{
try
{
// 1. 查询主表信息
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
if (entity == null)
{
throw NCCException.Oh(ErrorCode.COM1005, "退卡记录不存在");
}
var output = entity.Adapt();
// 2. 查询品项明细列表
var lqHytkMxList = await _db.Queryable().Where(w => w.RefundInfoId == entity.Id).ToListAsync();
// 3. 查询健康师业绩列表
var lqHytkJksyjList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync();
// 4. 查询科技部老师业绩列表
var lqHytkKjbsyjList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync();
// 5. 构建品项明细输出,每个品项关联对应的业绩信息
var mxOutputList = new List();
foreach (var mx in lqHytkMxList)
{
var mxOutput = new LqHytkMxInfoOutput
{
id = mx.Id,
refundInfoId = mx.RefundInfoId,
billingItemId = mx.BillingItemId,
px = mx.Px,
pxmc = mx.Pxmc,
pxjg = mx.Pxjg,
tkje = mx.Tkje,
projectNumber = mx.ProjectNumber,
isEnabled = mx.IsEnabled,
sourceType = mx.SourceType,
totalPrice = mx.TotalPrice,
};
// 关联该品项的健康师业绩
var jksyjForMx = lqHytkJksyjList.Where(j => j.CardReturn == mx.Id).ToList();
mxOutput.lqHytkJksyjList = jksyjForMx.Adapt>();
// 关联该品项的科技部老师业绩
var kjbsyjForMx = lqHytkKjbsyjList.Where(k => k.CardReturn == mx.Id).ToList();
mxOutput.lqHytkKjbsyjList = kjbsyjForMx.Adapt>();
mxOutputList.Add(mxOutput);
}
// 6. 设置输出结果
output.lqHytkMxList = mxOutputList;
// 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩)
output.lqHytkJksyjList = lqHytkJksyjList.Adapt>();
output.lqHytkKjbsyjList = lqHytkKjbsyjList.Adapt>();
return output;
}
catch (Exception)
{
throw NCCException.Oh(ErrorCode.COM1000, "获取退卡记录失败");
}
}
#endregion
}
}