using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
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.Common;
using NCC.Extend.Entitys.Dto.LqKdKdjlb;
using NCC.Extend.Entitys.Enum;
using NCC.Extend.Entitys.lq_jinsanjiao_user;
using NCC.Extend.Entitys.lq_kd_deductinfo;
using NCC.Extend.Entitys.lq_kd_jksyj;
using NCC.Extend.Entitys.lq_kd_kdjlb;
using NCC.Extend.Entitys.lq_kd_kjbsyj;
using NCC.Extend.Entitys.lq_kd_pxmx;
using NCC.Extend.Entitys.lq_khxx;
using NCC.Extend.Entitys.lq_xmzl;
using NCC.Extend.Interfaces.LqKdKdjlb;
using NCC.Extend.Utils;
using NCC.FriendlyException;
using NCC.JsonSerialization;
using NCC.System.Entitys.Permission;
using SqlSugar;
using Yitter.IdGenerator;
namespace NCC.Extend.LqKdKdjlb
{
///
/// 开单记录表服务
///
[ApiDescriptionSettings(Tag = "绿纤开单记录表服务", Name = "LqKdKdjlb", Order = 200)]
[Route("api/Extend/[controller]")]
public class LqKdKdjlbService : ILqKdKdjlbService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _lqKdKdjlbRepository;
private readonly ISqlSugarRepository _lqKdJksyjRepository;
private readonly ISqlSugarRepository _lqKdKjbsyjRepository;
private readonly ISqlSugarRepository _lqKdPxmxRepository;
private readonly SqlSugarScope _db;
private readonly IUserManager _userManager;
private readonly WeChatBotService _weChatBotService;
private readonly LqKdKdjlbStringGenerator _stringGenerator;
///
/// 初始化一个类型的新实例
///
public LqKdKdjlbService(
ISqlSugarRepository lqKdKdjlbRepository,
ISqlSugarRepository lqKdJksyjRepository,
ISqlSugarRepository lqKdKjbsyjRepository,
ISqlSugarRepository lqKdPxmxRepository,
IUserManager userManager,
WeChatBotService weChatBotService,
LqKdKdjlbStringGenerator stringGenerator
)
{
_lqKdKdjlbRepository = lqKdKdjlbRepository;
_db = _lqKdKdjlbRepository.Context;
_lqKdJksyjRepository = lqKdJksyjRepository;
_lqKdKjbsyjRepository = lqKdKjbsyjRepository;
_lqKdPxmxRepository = lqKdPxmxRepository;
_userManager = userManager;
_weChatBotService = weChatBotService;
_stringGenerator = stringGenerator;
}
#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 lqKdPxmxList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync();
// 3. 查询健康师业绩列表
var lqKdJksyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync();
// 4. 查询科技部老师业绩列表
var lqKdKjbsyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync();
// 5. 构建品项明细输出,每个品项关联对应的业绩信息
var pxmxOutputList = new List();
foreach (var pxmx in lqKdPxmxList)
{
var pxmxOutput = new LqKdPxmxInfoOutput
{
id = pxmx.Id,
glkdbh = pxmx.Glkdbh,
px = pxmx.Px,
pxmc = pxmx.Pxmc,
pxjg = pxmx.Pxjg,
projectNumber = pxmx.ProjectNumber,
isEnabled = pxmx.IsEnabled,
sourceType = pxmx.SourceType,
memberId = pxmx.MemberId,
createTime = pxmx.CreateTIme,
totalPrice = pxmx.TotalPrice,
actualPrice = pxmx.ActualPrice,
};
// 关联该品项的健康师业绩
var jksyjForPx = lqKdJksyjList.Where(j => j.Kdpxid == pxmx.Id).ToList();
pxmxOutput.lqKdJksyjList = jksyjForPx.Adapt>();
// 关联该品项的科技部老师业绩
var kjbsyjForPx = lqKdKjbsyjList.Where(k => k.Kdpxid == pxmx.Id).ToList();
pxmxOutput.lqKdKjbsyjList = kjbsyjForPx.Adapt>();
pxmxOutputList.Add(pxmxOutput);
}
// 6. 设置输出结果
output.lqKdPxmxList = pxmxOutputList;
// 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩)
output.lqKdJksyjList = lqKdJksyjList.Adapt>();
output.lqKdKjbsyjList = lqKdKjbsyjList.Adapt>();
return output;
}
catch (Exception ex)
{
Console.WriteLine($"获取开单记录失败: {ex.Message}");
throw NCCException.Oh(ErrorCode.COM1000, "获取开单记录失败");
}
}
#endregion
#region 获取开单记录表列表
///
/// 获取开单记录表列表
///
/// 请求参数
///
[HttpGet("")]
public async Task GetList([FromQuery] LqKdKdjlbListQueryInput input)
{
var sidx = input.sidx == null ? "id" : input.sidx;
List queryKdrq = input.kdrq != null ? input.kdrq.Split(',').ToObeject>() : null;
DateTime? startKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.First()) : null;
DateTime? endKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.Last()) : null;
var data = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.djmd), p => p.Djmd.Equals(input.djmd))
.WhereIF(!string.IsNullOrEmpty(input.jsj), p => p.Jsj.Equals(input.jsj))
.WhereIF(queryKdrq != null, p => p.Kdrq >= new DateTime(startKdrq.ToDate().Year, startKdrq.ToDate().Month, startKdrq.ToDate().Day, 0, 0, 0))
.WhereIF(queryKdrq != null, p => p.Kdrq <= new DateTime(endKdrq.ToDate().Year, endKdrq.ToDate().Month, endKdrq.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.gjlx), p => p.Gjlx.Equals(input.gjlx))
.WhereIF(!string.IsNullOrEmpty(input.hgjg), p => p.Hgjg.Equals(input.hgjg))
.WhereIF(!string.IsNullOrEmpty(input.zdyj), p => p.Zdyj.Equals(input.zdyj))
.WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj))
.WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
.WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs))
.WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs))
.WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy))
.WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd))
.WhereIF(!string.IsNullOrEmpty(input.khly), p => p.Khly.Equals(input.khly))
.WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr))
.WhereIF(!string.IsNullOrEmpty(input.sfskdd), p => p.Sfskdd.Equals(input.sfskdd))
.WhereIF(!string.IsNullOrEmpty(input.jj), p => p.Jj.Contains(input.jj))
.WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
.WhereIF(!string.IsNullOrEmpty(input.kdhy), p => p.Kdhy.Equals(input.kdhy))
.WhereIF(!string.IsNullOrEmpty(input.kdhyc), p => p.Kdhyc.Contains(input.kdhyc))
.WhereIF(!string.IsNullOrEmpty(input.kdhysjh), p => p.Kdhysjh.Contains(input.kdhysjh))
.WhereIF(!string.IsNullOrEmpty(input.jksyj), p => p.Jksyj.Contains(input.jksyj))
.WhereIF(!string.IsNullOrEmpty(input.kjblsyj), p => p.Kjblsyj.Contains(input.kjblsyj))
.WhereIF(!string.IsNullOrEmpty(input.pxxx), p => p.Pxxx.Contains(input.pxxx))
.WhereIF(!string.IsNullOrEmpty(input.F_FIleUrl), p => p.F_FIleUrl.Contains(input.F_FIleUrl))
.Select(it => new LqKdKdjlbListOutput
{
id = it.Id,
djmd = it.Djmd,
jsj = it.Jsj,
kdrq = it.Kdrq,
gjlx = it.Gjlx,
hgjg = it.Hgjg,
zdyj = it.Zdyj,
sfyj = it.Sfyj,
qk = it.Qk,
ckfs = it.Ckfs,
fkfs = it.Fkfs,
fkyy = it.Fkyy,
fkpd = it.Fkpd,
khly = it.Khly,
tjr = it.Tjr,
deductAmount = it.DeductAmount,
sfskdd = it.Sfskdd,
jj = it.Jj,
bz = it.Bz,
kdhy = it.Kdhy,
kdhyc = it.Kdhyc,
kdhysjh = it.Kdhysjh,
jksyj = it.Jksyj,
kjblsyj = it.Kjblsyj,
pxxx = it.Pxxx,
IsEffective = it.IsEffective,
})
.MergeTable()
.OrderBy(sidx + " " + input.sort)
.ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult.SqlSugarPageResult(data);
}
#endregion
#region 新建开单记录表
///
/// 新建开单记录表
///
/// 参数
///
[HttpPost("")]
public async Task Create([FromBody] LqKdKdjlbCrInput input)
{
var userInfo = await _userManager.GetUserInfo();
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
entity.CreateTime = DateTime.Now;
entity.UpdateTime = DateTime.Now;
try
{
//开启事务
_db.BeginTran();
//新增开单记录表记录
entity.CreateUser = userInfo.userId;
entity.DeductAmount = input.lqKdKdjlbDeductList.Sum(x => x.Amount ?? 0);//计算储扣总金额
var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync();
//循环品相信息
// 收集所有需要插入的实体,然后批量插入
var allPxmxEntities = new List();
var allJksyjEntities = new List();
var allKjbsyjEntities = new List();
var allDeductEntities = new List();
// 处理扣款信息列表
foreach (var item in input.lqKdKdjlbDeductList)
{
var lqKdDeductEntity = new LqKdDeductinfoEntity
{
Id = YitIdHelper.NextId().ToString(),
BillingId = newEntity.Id,
DeductId = item.DeductId,
DeductType = item.DeductType,
Amount = item.Amount,
};
allDeductEntities.Add(lqKdDeductEntity);
}
// 处理品项明细列表
foreach (var item in input.lqKdPxmxList)
{
// 创建品项明细实体
var lqKdPxmxEntity = new LqKdPxmxEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = newEntity.Id,
CreateTIme = DateTime.Now,
MemberId = entity.Kdhy,
IsEnabled = 0,
ProjectNumber = item.projectNumber,
TotalPrice = (decimal)(item.pxjg * item.projectNumber),
Px = item.px,
Pxmc = item.pxmc,
Pxjg = item.pxjg,
SourceType = item.sourceType,
ActualPrice = item.actualPrice,
};
allPxmxEntities.Add(lqKdPxmxEntity);
// 收集该品项关联的健康师业绩
if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any())
{
foreach (var ijks_tem in item.lqKdJksyjList)
{
allJksyjEntities.Add(
new LqKdJksyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = newEntity.Id,
Jks = ijks_tem.jks,
Jksxm = ijks_tem.jksxm,
Jkszh = ijks_tem.jkszh,
Jksyj = ijks_tem.jksyj,
Yjsj = input.kdrq,
Jsj_id = ijks_tem.jsj_id,
Kdpxid = lqKdPxmxEntity.Id,
}
);
}
}
// 收集该品项关联的科技部老师业绩
if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any())
{
foreach (var ikjbs_tem in item.lqKdKjbsyjList)
{
allKjbsyjEntities.Add(
new LqKdKjbsyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = newEntity.Id,
Kjbls = ikjbs_tem.kjbls,
Kjblsxm = ikjbs_tem.kjblsxm,
Kjblszh = ikjbs_tem.kjblszh,
Kjblsyj = ikjbs_tem.kjblsyj,
Yjsj = input.kdrq,
Kdpxid = lqKdPxmxEntity.Id,
}
);
}
}
}
//通过会员id查询会员信息
var memberInfo = await _db.Queryable().Where(u => u.Id == entity.Kdhy).FirstAsync();
//通过开单记录表查询这个会员开单金额
var kdAmount = await _db.Queryable().Where(u => u.Kdhy == entity.Kdhy).SumAsync(u => u.Sfyj);
//如果开单金额小于500,为散客,如果大于500,为会员
if (kdAmount < 500)
{
memberInfo.Khlx = MemberTypeEnum.散客.GetHashCode().ToString();
}
else
{
memberInfo.Khlx = MemberTypeEnum.会员.GetHashCode().ToString();
}
await _db.Updateable(memberInfo).ExecuteCommandAsync();
// 批量插入扣款信息
if (allDeductEntities.Any())
{
await _db.Insertable(allDeductEntities).ExecuteCommandAsync();
}
// 批量插入品项明细
if (allPxmxEntities.Any())
{
await _db.Insertable(allPxmxEntities).ExecuteCommandAsync();
}
// 批量插入健康师业绩
if (allJksyjEntities.Any())
{
await _db.Insertable(allJksyjEntities).ExecuteCommandAsync();
}
// 批量插入科技部老师业绩
if (allKjbsyjEntities.Any())
{
await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync();
}
//关闭事务
_db.CommitTran();
// 生成开单记录字符串并发送到企业微信
try
{
var entityInfo = await GetInfo(newEntity.Id);
if (entityInfo != null)
{
var orderRecordString = _stringGenerator.GenerateOrderRecordString(entityInfo);
Console.WriteLine("开单记录字符串生成成功:");
Console.WriteLine(orderRecordString);
// 发送到企业微信群
try
{
var sendResult = await _weChatBotService.SendOrderRecordMessage(orderRecordString);
if (sendResult)
{
Console.WriteLine("开单记录已成功发送到企业微信群");
}
else
{
Console.WriteLine("开单记录发送到企业微信群失败");
}
}
catch (Exception wechatEx)
{
Console.WriteLine($"发送企业微信消息异常: {wechatEx.Message}");
}
}
}
catch (Exception ex)
{
// 字符串生成失败不影响主流程,只记录日志
Console.WriteLine($"生成开单记录字符串失败: {ex.Message}");
}
}
catch (Exception ex)
{
//回滚事务
_db.RollbackTran();
Console.WriteLine($"开单创建失败: {ex.Message}");
Console.WriteLine($"异常堆栈: {ex.StackTrace}");
throw NCCException.Oh(ErrorCode.COM1000);
}
}
#endregion
#region 获取开单记录表无分页列表
///
/// 获取开单记录表无分页列表
///
/// 请求参数
///
[NonAction]
public async Task GetNoPagingList([FromQuery] LqKdKdjlbListQueryInput input)
{
var sidx = input.sidx == null ? "id" : input.sidx;
List queryKdrq = input.kdrq != null ? input.kdrq.Split(',').ToObeject>() : null;
DateTime? startKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.First()) : null;
DateTime? endKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.Last()) : null;
var data = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.djmd), p => p.Djmd.Equals(input.djmd))
.WhereIF(!string.IsNullOrEmpty(input.jsj), p => p.Jsj.Equals(input.jsj))
.WhereIF(queryKdrq != null, p => p.Kdrq >= new DateTime(startKdrq.ToDate().Year, startKdrq.ToDate().Month, startKdrq.ToDate().Day, 0, 0, 0))
.WhereIF(queryKdrq != null, p => p.Kdrq <= new DateTime(endKdrq.ToDate().Year, endKdrq.ToDate().Month, endKdrq.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.gjlx), p => p.Gjlx.Equals(input.gjlx))
.WhereIF(!string.IsNullOrEmpty(input.hgjg), p => p.Hgjg.Equals(input.hgjg))
.WhereIF(!string.IsNullOrEmpty(input.zdyj), p => p.Zdyj.Equals(input.zdyj))
.WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj))
.WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
.WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs))
.WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs))
.WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy))
.WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd))
.WhereIF(!string.IsNullOrEmpty(input.khly), p => p.Khly.Equals(input.khly))
.WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr))
.WhereIF(!string.IsNullOrEmpty(input.sfskdd), p => p.Sfskdd.Equals(input.sfskdd))
.WhereIF(!string.IsNullOrEmpty(input.jj), p => p.Jj.Contains(input.jj))
.WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
.WhereIF(!string.IsNullOrEmpty(input.kdhy), p => p.Kdhy.Equals(input.kdhy))
.WhereIF(!string.IsNullOrEmpty(input.kdhyc), p => p.Kdhyc.Contains(input.kdhyc))
.WhereIF(!string.IsNullOrEmpty(input.kdhysjh), p => p.Kdhysjh.Contains(input.kdhysjh))
.WhereIF(!string.IsNullOrEmpty(input.jksyj), p => p.Jksyj.Contains(input.jksyj))
.WhereIF(!string.IsNullOrEmpty(input.kjblsyj), p => p.Kjblsyj.Contains(input.kjblsyj))
.WhereIF(!string.IsNullOrEmpty(input.pxxx), p => p.Pxxx.Contains(input.pxxx))
.WhereIF(!string.IsNullOrEmpty(input.F_FIleUrl), p => p.F_FIleUrl.Contains(input.F_FIleUrl))
.Select(it => new LqKdKdjlbListOutput
{
id = it.Id,
djmd = it.Djmd,
jsj = it.Jsj,
kdrq = it.Kdrq,
gjlx = it.Gjlx,
hgjg = it.Hgjg,
zdyj = it.Zdyj,
sfyj = it.Sfyj,
qk = it.Qk,
ckfs = it.Ckfs,
deductAmount = it.DeductAmount,
fkfs = it.Fkfs,
fkyy = it.Fkyy,
fkpd = it.Fkpd,
khly = it.Khly,
tjr = it.Tjr,
sfskdd = it.Sfskdd,
jj = it.Jj,
bz = it.Bz,
kdhy = it.Kdhy,
kdhyc = it.Kdhyc,
kdhysjh = it.Kdhysjh,
jksyj = it.Jksyj,
kjblsyj = it.Kjblsyj,
pxxx = it.Pxxx,
F_FIleUrl = it.F_FIleUrl,
})
.MergeTable()
.OrderBy(sidx + " " + input.sort)
.ToListAsync();
return data;
}
#endregion
#region 导出开单记录表
///
/// 导出开单记录表
///
/// 请求参数
///
[HttpGet("Actions/Export")]
public async Task Export([FromQuery] LqKdKdjlbListQueryInput input)
{
var userInfo = await _userManager.GetUserInfo();
var exportData = new List();
if (input.dataType == 0)
{
var data = Clay.Object(await this.GetList(input));
exportData = data.Solidify>().list;
}
else
{
exportData = await this.GetNoPagingList(input);
}
List paramList =
"[{\"value\":\"开单编号\",\"field\":\"id\"},{\"value\":\"开单会员\",\"field\":\"kdhy\"},{\"value\":\"开单会员名称\",\"field\":\"kdhyc\"},{\"value\":\"会员手机号\",\"field\":\"kdhysjh\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"金三角\",\"field\":\"jsj\"},{\"value\":\"开单日期\",\"field\":\"kdrq\"},{\"value\":\"顾客类型\",\"field\":\"gjlx\"},{\"value\":\"合作机构\",\"field\":\"hgjg\"},{\"value\":\"整单业绩\",\"field\":\"zdyj\"},{\"value\":\"实付业绩\",\"field\":\"sfyj\"},{\"value\":\"欠款\",\"field\":\"qk\"},{\"value\":\"储扣方式\",\"field\":\"ckfs\"},{\"value\":\"储扣明细\",\"field\":\"ckmx\"},{\"value\":\"付款方式\",\"field\":\"fkfs\"},{\"value\":\"付款医院\",\"field\":\"fkyy\"},{\"value\":\"付款判断\",\"field\":\"fkpd\"},{\"value\":\"客户来源\",\"field\":\"khly\"},{\"value\":\"推荐人\",\"field\":\"tjr\"},{\"value\":\"是否首开订单\",\"field\":\"sfskdd\"},{\"value\":\"简介\",\"field\":\"jj\"},{\"value\":\"备注\",\"field\":\"bz\"},{\"value\":\"健康师业绩\",\"field\":\"jksyj\"},{\"value\":\"科技部老师业绩\",\"field\":\"kjblsyj\"},{\"value\":\"品项信息\",\"field\":\"pxxx\"},{\"value\":\"方案其他\",\"field\":\"F_FIleUrl\"},]".ToList();
ExcelConfig excelconfig = new ExcelConfig();
excelconfig.FileName = "开单记录表.xls";
excelconfig.HeadFont = "微软雅黑";
excelconfig.HeadPoint = 10;
excelconfig.IsAllSizeColumn = true;
excelconfig.ColumnModel = new List();
List selectKeyList = input.selectKey.Split(',').ToList();
foreach (var item in selectKeyList)
{
var isExist = paramList.Find(p => p.field == item);
if (isExist != null)
{
excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value });
}
}
var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
ExcelExportHelper.Export(exportData, excelconfig, addPath);
var fileName = _userManager.UserId + "|" + addPath + "|xls";
var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
return output;
}
#endregion
#region 批量删除开单记录表
///
/// 批量删除开单记录表
///
/// 主键数组
///
[HttpPost("batchRemove")]
public async Task BatchRemove([FromBody] List ids)
{
var entitys = await _db.Queryable().In(it => it.Id, ids).ToListAsync();
if (entitys.Count > 0)
{
try
{
//开启事务
_db.BeginTran();
//批量删除开单记录表
await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync();
//清空子表数据
await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync();
//清空子表数据
await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync();
//清空子表数据
await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync();
//关闭事务
_db.CommitTran();
}
catch (Exception)
{
//回滚事务
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1002);
}
}
}
#endregion
#region 更新开单记录表
///
/// 更新开单记录表
///
///
/// 更新开单记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
///
/// 示例请求:
/// ```json
/// {
/// "id": "开单编号",
/// "djmd": "单据门店",
/// "jsj": "金三角",
/// "kdrq": "2025-01-11",
/// "lqKdPxmxList": [
/// {
/// "px": "品项编号",
/// "pxmc": "品项名称",
/// "pxjg": 100.00,
/// "projectNumber": 1,
/// "sourceType": "购买",
/// "lqKdJksyjList": [
/// {
/// "jks": "健康师",
/// "jksxm": "健康师姓名",
/// "jksyj": "100"
/// }
/// ]
/// }
/// ]
/// }
/// ```
///
/// 参数说明:
/// - id: 开单记录主键ID
/// - input: 开单记录更新参数,包含品项明细和业绩信息
///
/// 开单记录主键ID
/// 开单记录更新参数
/// 无返回值
/// 更新成功
/// 参数错误或数据验证失败
/// 服务器内部错误
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] LqKdKdjlbUpInput input)
{
var entity = input.Adapt();
try
{
//开启事务
_db.BeginTran();
//更新开单记录表记录
await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
//清空原有数据
await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
// 收集所有需要插入的实体,然后批量插入
var allPxmxEntities = new List();
var allJksyjEntities = new List();
var allKjbsyjEntities = new List();
// 处理品项明细列表
if (input.lqKdPxmxList != null && input.lqKdPxmxList.Any())
{
foreach (var item in input.lqKdPxmxList)
{
// 创建品项明细实体
var lqKdPxmxEntity = new LqKdPxmxEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
CreateTIme = DateTime.Now,
MemberId = entity.Kdhy,
IsEnabled = 0,
ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber,
TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)),
Px = item.px,
Pxmc = item.pxmc,
Pxjg = item.pxjg,
SourceType = item.sourceType,
};
allPxmxEntities.Add(lqKdPxmxEntity);
// 收集该品项关联的健康师业绩
if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any())
{
foreach (var ijks_tem in item.lqKdJksyjList)
{
allJksyjEntities.Add(
new LqKdJksyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
Jks = ijks_tem.jks,
Jksxm = ijks_tem.jksxm,
Jkszh = ijks_tem.jkszh,
Jksyj = ijks_tem.jksyj,
Yjsj = DateTime.Now,
Jsj_id = ijks_tem.jsj_id,
Kdpxid = lqKdPxmxEntity.Id,
}
);
}
}
// 收集该品项关联的科技部老师业绩
if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any())
{
foreach (var ikjbs_tem in item.lqKdKjbsyjList)
{
allKjbsyjEntities.Add(
new LqKdKjbsyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
Kjbls = ikjbs_tem.kjbls,
Kjblsxm = ikjbs_tem.kjblsxm,
Kjblszh = ikjbs_tem.kjblszh,
Kjblsyj = ikjbs_tem.kjblsyj,
Yjsj = DateTime.Now,
Kdpxid = lqKdPxmxEntity.Id,
}
);
}
}
}
}
// 批量插入品项明细
if (allPxmxEntities.Any())
{
await _db.Insertable(allPxmxEntities).ExecuteCommandAsync();
}
// 批量插入健康师业绩
if (allJksyjEntities.Any())
{
await _db.Insertable(allJksyjEntities).ExecuteCommandAsync();
}
// 批量插入科技部老师业绩
if (allKjbsyjEntities.Any())
{
await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync();
}
//关闭事务
_db.CommitTran();
}
catch (Exception)
{
//回滚事务
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1001);
}
}
#endregion
#region 删除开单记录表
///
/// 删除开单记录表
///
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
try
{
//开启事务
_db.BeginTran();
//删除开单记录表记录
await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync();
//清空子表数据
await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
//清空子表数据
await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
//清空子表数据
await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
//关闭事务
_db.CommitTran();
}
catch (Exception)
{
//回滚事务
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1002);
}
}
#endregion
#region 获取扣款类型枚举内容
///
/// 获取扣款类型枚举内容
///
/// 扣款类型枚举列表
[HttpGet("deduct-types")]
public List GetDeductTypes()
{
return Enum.GetValues()
.Select(e => new EnumOutput
{
Value = (int)e,
Name = e.ToString(),
Description = e.GetDescription(),
})
.ToList();
}
#endregion
#region 修改开单记录,不做删除,仅健康师业绩、科技部老师业绩信息
///
/// 修改开单记录,不做删除,仅健康师业绩、科技部老师业绩信息
///
///
/// 更新开单记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
///
/// 示例请求:
/// ```json
/// {
/// "id": "开单编号",
/// "djmd": "单据门店",
/// "jsj": "金三角",
/// "kdrq": "2025-01-11",
/// "lqKdPxmxList": [
/// {
/// "px": "品项编号",
/// "pxmc": "品项名称",
/// "pxjg": 100.00,
/// "projectNumber": 1,
/// "sourceType": "购买",
/// "lqKdJksyjList": [
/// {
/// "jks": "健康师",
/// "jksxm": "健康师姓名",
/// "jksyj": "100"
/// }
/// ]
/// }
/// ]
/// }
/// ```
///
/// 参数说明:
/// - id: 开单记录主键ID
/// - input: 开单记录更新参数,包含品项明细和业绩信息
///
/// 开单记录主键ID
/// 开单记录更新参数
/// 无返回值
/// 更新成功
/// 参数错误或数据验证失败
/// 服务器内部错误
[HttpPut("UpdateForNoDelete/{id}")]
public async Task UpdateForNoDelete(string id, [FromBody] LqKdKdjlbUpInput input)
{
var entity = input.Adapt();
entity.Id = id; // 确保ID正确设置
try
{
//开启事务
_db.BeginTran();
// 更新开单记录主表
await _db.Updateable(entity)
.IgnoreColumns(ignoreAllNullColumns: true)
.IgnoreColumns(x => x.CreateTime) // 不更新创建时间
.ExecuteCommandAsync();
// 处理品项明细列表 - 更新或插入
if (input.lqKdPxmxList != null && input.lqKdPxmxList.Any())
{
foreach (var item in input.lqKdPxmxList)
{
// 检查品项明细是否已存在
var existingPxmx = await _db.Queryable()
.Where(x => x.Glkdbh == id && x.Px == item.px)
.FirstAsync();
if (existingPxmx != null)
{
// 更新现有品项明细
existingPxmx.ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber;
existingPxmx.TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber));
existingPxmx.Pxmc = item.pxmc;
existingPxmx.Pxjg = item.pxjg;
existingPxmx.SourceType = item.sourceType;
await _db.Updateable(existingPxmx).ExecuteCommandAsync();
// 更新该品项关联的健康师业绩
if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any())
{
// 先删除该品项的所有健康师业绩
await _db.Deleteable()
.Where(x => x.Kdpxid == existingPxmx.Id)
.ExecuteCommandAsync();
// 重新插入健康师业绩
var jksyjEntities = item.lqKdJksyjList.Select(ijks_tem => new LqKdJksyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
Jks = ijks_tem.jks,
Jksxm = ijks_tem.jksxm,
Jkszh = ijks_tem.jkszh,
Jksyj = ijks_tem.jksyj,
Yjsj = DateTime.Now,
Jsj_id = ijks_tem.jsj_id,
Kdpxid = existingPxmx.Id,
}).ToList();
if (jksyjEntities.Any())
{
await _db.Insertable(jksyjEntities).ExecuteCommandAsync();
}
}
// 更新该品项关联的科技部老师业绩
if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any())
{
// 先删除该品项的所有科技部老师业绩
await _db.Deleteable()
.Where(x => x.Kdpxid == existingPxmx.Id)
.ExecuteCommandAsync();
// 重新插入科技部老师业绩
var kjbsyjEntities = item.lqKdKjbsyjList.Select(ikjbs_tem => new LqKdKjbsyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
Kjbls = ikjbs_tem.kjbls,
Kjblsxm = ikjbs_tem.kjblsxm,
Kjblszh = ikjbs_tem.kjblszh,
Kjblsyj = ikjbs_tem.kjblsyj,
Yjsj = DateTime.Now,
Kdpxid = existingPxmx.Id,
}).ToList();
if (kjbsyjEntities.Any())
{
await _db.Insertable(kjbsyjEntities).ExecuteCommandAsync();
}
}
}
else
{
// 插入新的品项明细
var newPxmxEntity = new LqKdPxmxEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
CreateTIme = DateTime.Now,
MemberId = entity.Kdhy,
IsEnabled = 0,
ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber,
TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)),
Px = item.px,
Pxmc = item.pxmc,
Pxjg = item.pxjg,
SourceType = item.sourceType,
};
await _db.Insertable(newPxmxEntity).ExecuteCommandAsync();
// 插入该品项关联的健康师业绩
if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any())
{
var jksyjEntities = item.lqKdJksyjList.Select(ijks_tem => new LqKdJksyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
Jks = ijks_tem.jks,
Jksxm = ijks_tem.jksxm,
Jkszh = ijks_tem.jkszh,
Jksyj = ijks_tem.jksyj,
Yjsj = DateTime.Now,
Jsj_id = ijks_tem.jsj_id,
Kdpxid = newPxmxEntity.Id,
}).ToList();
await _db.Insertable(jksyjEntities).ExecuteCommandAsync();
}
// 插入该品项关联的科技部老师业绩
if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any())
{
var kjbsyjEntities = item.lqKdKjbsyjList.Select(ikjbs_tem => new LqKdKjbsyjEntity
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = entity.Id,
Kjbls = ikjbs_tem.kjbls,
Kjblsxm = ikjbs_tem.kjblsxm,
Kjblszh = ikjbs_tem.kjblszh,
Kjblsyj = ikjbs_tem.kjblsyj,
Yjsj = DateTime.Now,
Kdpxid = newPxmxEntity.Id,
}).ToList();
await _db.Insertable(kjbsyjEntities).ExecuteCommandAsync();
}
}
}
}
//关闭事务
_db.CommitTran();
}
catch (Exception)
{
//回滚事务
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1001);
}
}
#endregion
#region 作废开单记录
///
/// 作废开单记录
///
/// 开单记录主键ID
/// 无返回值
/// 作废成功
/// 参数错误,开单记录ID不能为空
/// 开单记录不存在
/// 服务器内部错误
[HttpPut("Cancel/{id}")]
public async Task Cancel(string id)
{
if (string.IsNullOrEmpty(id))
{
throw NCCException.Oh("开单记录ID不能为空");
}
try
{
//开启事务
_db.BeginTran();
// 查询开单记录
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
if (entity == null)
{
throw NCCException.Oh("开单记录不存在");
}
// 检查是否已经作废
if (entity.IsEffective == 0)
{
throw NCCException.Oh("该开单记录已经作废");
}
// 标记开单记录为无效
entity.IsEffective = 0;
await _db.Updateable(entity).ExecuteCommandAsync();
// 标记对应开单明细表为无效
await _db.Updateable().SetColumns(it => new LqKdPxmxEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync();
// 标记健康师业绩为无效
await _db.Updateable().SetColumns(it => new LqKdJksyjEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync();
// 标记科技部老师业绩为无效
await _db.Updateable().SetColumns(it => new LqKdKjbsyjEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync();
//关闭事务
_db.CommitTran();
}
catch (Exception ex) when (!(ex is NCCException))
{
//回滚事务
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1001);
}
}
#endregion
}
}