using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.FriendlyException;
using NCC.Extend.Interfaces.LqGz;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NCC.Extend.Entitys.lq_gz;
using Yitter.IdGenerator;
using NCC.Common.Helper;
using NCC.JsonSerialization;
using NCC.Common.Model.NPOI;
using NCC.Common.Configuration;
using NCC.DataEncryption;
using NCC.ClayObject;
using NCC.Extend.Entitys.lq_kd_pxmx;
using NCC.Extend.Entitys.lq_xmzl;
using NCC.Extend.Entitys.lq_jlmxb;
using NCC.Extend.Entitys.lq_ycsd_jsj;
using NCC.Extend.Entitys.lq_mdxx;
using NCC.Extend.Entitys.lq_kd_kdjlb;
using NCC.Extend.Entitys.lq_kd_jksyj;
using NCC.Extend.Entitys.lq_kd_kjbsyj;
using Microsoft.Extensions.Logging;
using NCC.Extend.Entitys.Dto.LqGz;
namespace NCC.Extend.LqGz
{
///
/// 工资全字段服务
///
[ApiDescriptionSettings(Tag = "绿纤工资全字段服务",Name = "LqGz", Order = 200)]
[Route("api/Extend/[controller]")]
public class LqGzService : ILqGzService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _lqGzRepository;
private readonly SqlSugarScope _db;
private readonly IUserManager _userManager;
private readonly ILogger _logger;
///
/// 初始化一个类型的新实例
///
public LqGzService(
ISqlSugarRepository lqGzRepository,
IUserManager userManager,
ILogger logger)
{
_lqGzRepository = lqGzRepository;
_db = _lqGzRepository.Context;
_userManager = userManager;
_logger = logger;
}
///
/// 获取工资全字段
///
/// 参数
///
[HttpGet("{id}")]
public async Task GetInfo(string id)
{
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
var output = entity.Adapt();
return output;
}
///
/// 获取工资全字段列表
///
/// 请求参数
///
[HttpGet("")]
public async Task GetList([FromQuery] LqGzListQueryInput input)
{
var sidx = input.sidx == null ? "id" : input.sidx;
var data = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Contains(input.md))
.WhereIF(!string.IsNullOrEmpty(input.hsgw), p => p.Hsgw.Contains(input.hsgw))
.WhereIF(!string.IsNullOrEmpty(input.xm), p => p.Xm.Contains(input.xm))
.WhereIF(!string.IsNullOrEmpty(input.jsjzd), p => p.Jsjzd.Contains(input.jsjzd))
.WhereIF(!string.IsNullOrEmpty(input.zyj), p => p.Zyj.Equals(input.zyj))
.WhereIF(!string.IsNullOrEmpty(input.jcyj), p => p.Jcyj.Equals(input.jcyj))
.WhereIF(!string.IsNullOrEmpty(input.hzyj), p => p.Hzyj.Equals(input.hzyj))
.WhereIF(!string.IsNullOrEmpty(input.jlyj), p => p.Jlyj.Equals(input.jlyj))
.WhereIF(!string.IsNullOrEmpty(input.mdzyj), p => p.Mdzyj.Equals(input.mdzyj))
.WhereIF(!string.IsNullOrEmpty(input.dwyj), p => p.Dwyj.Equals(input.dwyj))
.WhereIF(!string.IsNullOrEmpty(input.zb), p => p.Zb.Equals(input.zb))
.WhereIF(!string.IsNullOrEmpty(input.xkyj), p => p.Xkyj.Equals(input.xkyj))
.WhereIF(!string.IsNullOrEmpty(input.xkcjl), p => p.Xkcjl.Equals(input.xkcjl))
.WhereIF(!string.IsNullOrEmpty(input.xktd), p => p.Xktd.Equals(input.xktd))
.WhereIF(!string.IsNullOrEmpty(input.sdyj), p => p.Sdyj.Equals(input.sdyj))
.WhereIF(!string.IsNullOrEmpty(input.sdtd), p => p.Sdtd.Equals(input.sdtd))
.WhereIF(!string.IsNullOrEmpty(input.syyj), p => p.Syyj.Equals(input.syyj))
.WhereIF(!string.IsNullOrEmpty(input.cellyj), p => p.Cellyj.Equals(input.cellyj))
.WhereIF(!string.IsNullOrEmpty(input.dxmybyj), p => p.Dxmybyj.Equals(input.dxmybyj))
.WhereIF(!string.IsNullOrEmpty(input.dxmebyj), p => p.Dxmebyj.Equals(input.dxmebyj))
.WhereIF(!string.IsNullOrEmpty(input.dyyj), p => p.Dyyj.Equals(input.dyyj))
.WhereIF(!string.IsNullOrEmpty(input.wysd), p => p.Wysd.Equals(input.wysd))
.WhereIF(!string.IsNullOrEmpty(input.mdzc), p => p.Mdzc.Equals(input.mdzc))
.WhereIF(!string.IsNullOrEmpty(input.cpwl), p => p.Cpwl.Equals(input.cpwl))
.WhereIF(!string.IsNullOrEmpty(input.wdcb), p => p.Wdcb.Equals(input.wdcb))
.WhereIF(!string.IsNullOrEmpty(input.qthzcb), p => p.Qthzcb.Equals(input.qthzcb))
.WhereIF(!string.IsNullOrEmpty(input.xmj), p => p.Xmj.Equals(input.xmj))
.WhereIF(!string.IsNullOrEmpty(input.ml), p => p.Ml.Equals(input.ml))
.WhereIF(!string.IsNullOrEmpty(input.zjltce), p => p.Zjltce.Equals(input.zjltce))
.WhereIF(!string.IsNullOrEmpty(input.jltce), p => p.Jltce.Equals(input.jltce))
.WhereIF(!string.IsNullOrEmpty(input.xh), p => p.Xh.Equals(input.xh))
.WhereIF(!string.IsNullOrEmpty(input.xms), p => p.Xms.Equals(input.xms))
.WhereIF(!string.IsNullOrEmpty(input.ddrt), p => p.Ddrt.Equals(input.ddrt))
.WhereIF(!string.IsNullOrEmpty(input.zdts), p => p.Zdts.Equals(input.zdts))
.WhereIF(!string.IsNullOrEmpty(input.qjts), p => p.Qjts.Equals(input.qjts))
.WhereIF(!string.IsNullOrEmpty(input.td), p => p.Td.Equals(input.td))
.WhereIF(!string.IsNullOrEmpty(input.jcyjtc), p => p.Jcyjtc.Equals(input.jcyjtc))
.WhereIF(!string.IsNullOrEmpty(input.hzyjtc), p => p.Hzyjtc.Equals(input.hzyjtc))
.WhereIF(!string.IsNullOrEmpty(input.gwtc), p => p.Gwtc.Equals(input.gwtc))
.WhereIF(!string.IsNullOrEmpty(input.mdtqtc), p => p.Mdtqtc.Equals(input.mdtqtc))
.WhereIF(!string.IsNullOrEmpty(input.dztc1), p => p.Dztc1.Equals(input.dztc1))
.WhereIF(!string.IsNullOrEmpty(input.dzzrtc), p => p.Dzzrtc.Equals(input.dzzrtc))
.WhereIF(!string.IsNullOrEmpty(input.zrtc), p => p.Zrtc.Equals(input.zrtc))
.WhereIF(!string.IsNullOrEmpty(input.dztc2), p => p.Dztc2.Equals(input.dztc2))
.WhereIF(!string.IsNullOrEmpty(input.zjltc), p => p.Zjltc.Equals(input.zjltc))
.WhereIF(!string.IsNullOrEmpty(input.jltc), p => p.Jltc.Equals(input.jltc))
.WhereIF(!string.IsNullOrEmpty(input.yjtc), p => p.Yjtc.Equals(input.yjtc))
.WhereIF(!string.IsNullOrEmpty(input.xhtc), p => p.Xhtc.Equals(input.xhtc))
.WhereIF(!string.IsNullOrEmpty(input.kjbzctc), p => p.Kjbzctc.Equals(input.kjbzctc))
.WhereIF(!string.IsNullOrEmpty(input.sytc), p => p.Sytc.Equals(input.sytc))
.WhereIF(!string.IsNullOrEmpty(input.celltc), p => p.Celltc.Equals(input.celltc))
.WhereIF(!string.IsNullOrEmpty(input.dxmbtc), p => p.Dxmbtc.Equals(input.dxmbtc))
.WhereIF(!string.IsNullOrEmpty(input.tchj), p => p.Tchj.Equals(input.tchj))
.WhereIF(!string.IsNullOrEmpty(input.jksdx), p => p.Jksdx.Equals(input.jksdx))
.WhereIF(!string.IsNullOrEmpty(input.dzhudx), p => p.Dzhudx.Equals(input.dzhudx))
.WhereIF(!string.IsNullOrEmpty(input.dzhangdx), p => p.Dzhangdx.Equals(input.dzhangdx))
.WhereIF(!string.IsNullOrEmpty(input.zrdx), p => p.Zrdx.Equals(input.zrdx))
.WhereIF(!string.IsNullOrEmpty(input.dzzrdx), p => p.Dzzrdx.Equals(input.dzzrdx))
.WhereIF(!string.IsNullOrEmpty(input.zjldx), p => p.Zjldx.Equals(input.zjldx))
.WhereIF(!string.IsNullOrEmpty(input.jldx), p => p.Jldx.Equals(input.jldx))
.WhereIF(!string.IsNullOrEmpty(input.kjblsdx), p => p.Kjblsdx.Equals(input.kjblsdx))
.WhereIF(!string.IsNullOrEmpty(input.dxmbdx), p => p.Dxmbdx.Equals(input.dxmbdx))
.WhereIF(!string.IsNullOrEmpty(input.dxhj), p => p.Dxhj.Equals(input.dxhj))
.WhereIF(!string.IsNullOrEmpty(input.sg), p => p.Sg.Equals(input.sg))
.WhereIF(!string.IsNullOrEmpty(input.rtjl), p => p.Rtjl.Equals(input.rtjl))
.WhereIF(!string.IsNullOrEmpty(input.sjgl), p => p.Sjgl.Equals(input.sjgl))
.WhereIF(!string.IsNullOrEmpty(input.cb), p => p.Cb.Equals(input.cb))
.WhereIF(!string.IsNullOrEmpty(input.sx), p => p.Sx.Equals(input.sx))
.WhereIF(!string.IsNullOrEmpty(input.qq), p => p.Qq.Equals(input.qq))
.WhereIF(!string.IsNullOrEmpty(input.hsyfgz), p => p.Hsyfgz.Equals(input.hsyfgz))
.WhereIF(!string.IsNullOrEmpty(input.bd), p => p.Bd.Equals(input.bd))
.WhereIF(!string.IsNullOrEmpty(input.bdqj), p => p.Bdqj.Equals(input.bdqj))
.WhereIF(!string.IsNullOrEmpty(input.bddx), p => p.Bddx.Equals(input.bddx))
.WhereIF(!string.IsNullOrEmpty(input.bdbc), p => p.Bdbc.Equals(input.bdbc))
.WhereIF(!string.IsNullOrEmpty(input.zzyfgz), p => p.Zzyfgz.Equals(input.zzyfgz))
.WhereIF(!string.IsNullOrEmpty(input.dypxbt), p => p.Dypxbt.Equals(input.dypxbt))
.WhereIF(!string.IsNullOrEmpty(input.dyjtbt), p => p.Dyjtbt.Equals(input.dyjtbt))
.WhereIF(!string.IsNullOrEmpty(input.sypxbt), p => p.Sypxbt.Equals(input.sypxbt))
.WhereIF(!string.IsNullOrEmpty(input.syjtbt), p => p.Syjtbt.Equals(input.syjtbt))
.WhereIF(!string.IsNullOrEmpty(input.bthj), p => p.Bthj.Equals(input.bthj))
.WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
.WhereIF(!string.IsNullOrEmpty(input.cd), p => p.Cd.Equals(input.cd))
.WhereIF(!string.IsNullOrEmpty(input.qj), p => p.Qj.Equals(input.qj))
.WhereIF(!string.IsNullOrEmpty(input.ksb), p => p.Ksb.Equals(input.ksb))
.WhereIF(!string.IsNullOrEmpty(input.kcjl), p => p.Kcjl.Equals(input.kcjl))
.WhereIF(!string.IsNullOrEmpty(input.kzs), p => p.Kzs.Equals(input.kzs))
.WhereIF(!string.IsNullOrEmpty(input.kxxq), p => p.Kxxq.Equals(input.kxxq))
.WhereIF(!string.IsNullOrEmpty(input.kgzf), p => p.Kgzf.Equals(input.kgzf))
.WhereIF(!string.IsNullOrEmpty(input.kkhj), p => p.Kkhj.Equals(input.kkhj))
.WhereIF(!string.IsNullOrEmpty(input.fjj), p => p.Fjj.Equals(input.fjj))
.WhereIF(!string.IsNullOrEmpty(input.tsjyj), p => p.Tsjyj.Equals(input.tsjyj))
.WhereIF(!string.IsNullOrEmpty(input.tzsyj), p => p.Tzsyj.Equals(input.tzsyj))
.WhereIF(!string.IsNullOrEmpty(input.sfgz), p => p.Sfgz.Equals(input.sfgz))
.WhereIF(!string.IsNullOrEmpty(input.dysfff), p => p.Dysfff.Contains(input.dysfff))
.WhereIF(!string.IsNullOrEmpty(input.zfje), p => p.Zfje.Equals(input.zfje))
.WhereIF(!string.IsNullOrEmpty(input.dzjfe), p => p.Dzjfe.Equals(input.dzjfe))
.WhereIF(!string.IsNullOrEmpty(input.bfsy), p => p.Bfsy.Equals(input.bfsy))
.WhereIF(!string.IsNullOrEmpty(input.dyzfze), p => p.Dyzfze.Equals(input.dyzfze))
.Select(it=> new LqGzListOutput
{
id = it.Id,
md=it.Md,
hsgw=it.Hsgw,
xm=it.Xm,
jsjzd=it.Jsjzd,
zyj=it.Zyj,
jcyj=it.Jcyj,
hzyj=it.Hzyj,
jlyj=it.Jlyj,
mdzyj=it.Mdzyj,
dwyj=it.Dwyj,
zb=it.Zb,
xkyj=it.Xkyj,
xkcjl=it.Xkcjl,
xktd=it.Xktd,
sdyj=it.Sdyj,
sdtd=it.Sdtd,
syyj=it.Syyj,
cellyj=it.Cellyj,
dxmybyj=it.Dxmybyj,
dxmebyj=it.Dxmebyj,
dyyj=it.Dyyj,
wysd=it.Wysd,
mdzc=it.Mdzc,
cpwl=it.Cpwl,
wdcb=it.Wdcb,
qthzcb=it.Qthzcb,
xmj=it.Xmj,
ml=it.Ml,
zjltce=it.Zjltce,
jltce=it.Jltce,
xh=it.Xh,
xms=it.Xms,
ddrt=it.Ddrt,
zdts=it.Zdts,
qjts=it.Qjts,
td=it.Td,
jcyjtc=it.Jcyjtc,
hzyjtc=it.Hzyjtc,
gwtc=it.Gwtc,
mdtqtc=it.Mdtqtc,
dztc1=it.Dztc1,
dzzrtc=it.Dzzrtc,
zrtc=it.Zrtc,
dztc2=it.Dztc2,
zjltc=it.Zjltc,
jltc=it.Jltc,
yjtc=it.Yjtc,
xhtc=it.Xhtc,
kjbzctc=it.Kjbzctc,
sytc=it.Sytc,
celltc=it.Celltc,
dxmbtc=it.Dxmbtc,
tchj=it.Tchj,
jksdx=it.Jksdx,
dzhudx=it.Dzhudx,
dzhangdx=it.Dzhangdx,
zrdx=it.Zrdx,
dzzrdx=it.Dzzrdx,
zjldx=it.Zjldx,
jldx=it.Jldx,
kjblsdx=it.Kjblsdx,
dxmbdx=it.Dxmbdx,
dxhj=it.Dxhj,
sg=it.Sg,
rtjl=it.Rtjl,
sjgl=it.Sjgl,
cb=it.Cb,
sx=it.Sx,
qq=it.Qq,
hsyfgz=it.Hsyfgz,
bd=it.Bd,
bdqj=it.Bdqj,
bddx=it.Bddx,
bdbc=it.Bdbc,
zzyfgz=it.Zzyfgz,
dypxbt=it.Dypxbt,
dyjtbt=it.Dyjtbt,
sypxbt=it.Sypxbt,
syjtbt=it.Syjtbt,
bthj=it.Bthj,
qk=it.Qk,
cd=it.Cd,
qj=it.Qj,
ksb=it.Ksb,
kcjl=it.Kcjl,
kzs=it.Kzs,
kxxq=it.Kxxq,
kgzf=it.Kgzf,
kkhj=it.Kkhj,
fjj=it.Fjj,
tsjyj=it.Tsjyj,
tzsyj=it.Tzsyj,
sfgz=it.Sfgz,
dysfff=it.Dysfff,
zfje=it.Zfje,
dzjfe=it.Dzjfe,
bfsy=it.Bfsy,
dyzfze=it.Dyzfze,
}).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult.SqlSugarPageResult(data);
}
///
/// 新建工资全字段
///
/// 参数
///
[HttpPost("")]
public async Task Create([FromBody] LqGzCrInput input)
{
var userInfo = await _userManager.GetUserInfo();
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
}
///
/// 获取工资全字段无分页列表
///
/// 请求参数
///
[NonAction]
public async Task GetNoPagingList([FromQuery] LqGzListQueryInput input)
{
var sidx = input.sidx == null ? "id" : input.sidx;
var data = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Contains(input.md))
.WhereIF(!string.IsNullOrEmpty(input.hsgw), p => p.Hsgw.Contains(input.hsgw))
.WhereIF(!string.IsNullOrEmpty(input.xm), p => p.Xm.Contains(input.xm))
.WhereIF(!string.IsNullOrEmpty(input.jsjzd), p => p.Jsjzd.Contains(input.jsjzd))
.WhereIF(!string.IsNullOrEmpty(input.zyj), p => p.Zyj.Equals(input.zyj))
.WhereIF(!string.IsNullOrEmpty(input.jcyj), p => p.Jcyj.Equals(input.jcyj))
.WhereIF(!string.IsNullOrEmpty(input.hzyj), p => p.Hzyj.Equals(input.hzyj))
.WhereIF(!string.IsNullOrEmpty(input.jlyj), p => p.Jlyj.Equals(input.jlyj))
.WhereIF(!string.IsNullOrEmpty(input.mdzyj), p => p.Mdzyj.Equals(input.mdzyj))
.WhereIF(!string.IsNullOrEmpty(input.dwyj), p => p.Dwyj.Equals(input.dwyj))
.WhereIF(!string.IsNullOrEmpty(input.zb), p => p.Zb.Equals(input.zb))
.WhereIF(!string.IsNullOrEmpty(input.xkyj), p => p.Xkyj.Equals(input.xkyj))
.WhereIF(!string.IsNullOrEmpty(input.xkcjl), p => p.Xkcjl.Equals(input.xkcjl))
.WhereIF(!string.IsNullOrEmpty(input.xktd), p => p.Xktd.Equals(input.xktd))
.WhereIF(!string.IsNullOrEmpty(input.sdyj), p => p.Sdyj.Equals(input.sdyj))
.WhereIF(!string.IsNullOrEmpty(input.sdtd), p => p.Sdtd.Equals(input.sdtd))
.WhereIF(!string.IsNullOrEmpty(input.syyj), p => p.Syyj.Equals(input.syyj))
.WhereIF(!string.IsNullOrEmpty(input.cellyj), p => p.Cellyj.Equals(input.cellyj))
.WhereIF(!string.IsNullOrEmpty(input.dxmybyj), p => p.Dxmybyj.Equals(input.dxmybyj))
.WhereIF(!string.IsNullOrEmpty(input.dxmebyj), p => p.Dxmebyj.Equals(input.dxmebyj))
.WhereIF(!string.IsNullOrEmpty(input.dyyj), p => p.Dyyj.Equals(input.dyyj))
.WhereIF(!string.IsNullOrEmpty(input.wysd), p => p.Wysd.Equals(input.wysd))
.WhereIF(!string.IsNullOrEmpty(input.mdzc), p => p.Mdzc.Equals(input.mdzc))
.WhereIF(!string.IsNullOrEmpty(input.cpwl), p => p.Cpwl.Equals(input.cpwl))
.WhereIF(!string.IsNullOrEmpty(input.wdcb), p => p.Wdcb.Equals(input.wdcb))
.WhereIF(!string.IsNullOrEmpty(input.qthzcb), p => p.Qthzcb.Equals(input.qthzcb))
.WhereIF(!string.IsNullOrEmpty(input.xmj), p => p.Xmj.Equals(input.xmj))
.WhereIF(!string.IsNullOrEmpty(input.ml), p => p.Ml.Equals(input.ml))
.WhereIF(!string.IsNullOrEmpty(input.zjltce), p => p.Zjltce.Equals(input.zjltce))
.WhereIF(!string.IsNullOrEmpty(input.jltce), p => p.Jltce.Equals(input.jltce))
.WhereIF(!string.IsNullOrEmpty(input.xh), p => p.Xh.Equals(input.xh))
.WhereIF(!string.IsNullOrEmpty(input.xms), p => p.Xms.Equals(input.xms))
.WhereIF(!string.IsNullOrEmpty(input.ddrt), p => p.Ddrt.Equals(input.ddrt))
.WhereIF(!string.IsNullOrEmpty(input.zdts), p => p.Zdts.Equals(input.zdts))
.WhereIF(!string.IsNullOrEmpty(input.qjts), p => p.Qjts.Equals(input.qjts))
.WhereIF(!string.IsNullOrEmpty(input.td), p => p.Td.Equals(input.td))
.WhereIF(!string.IsNullOrEmpty(input.jcyjtc), p => p.Jcyjtc.Equals(input.jcyjtc))
.WhereIF(!string.IsNullOrEmpty(input.hzyjtc), p => p.Hzyjtc.Equals(input.hzyjtc))
.WhereIF(!string.IsNullOrEmpty(input.gwtc), p => p.Gwtc.Equals(input.gwtc))
.WhereIF(!string.IsNullOrEmpty(input.mdtqtc), p => p.Mdtqtc.Equals(input.mdtqtc))
.WhereIF(!string.IsNullOrEmpty(input.dztc1), p => p.Dztc1.Equals(input.dztc1))
.WhereIF(!string.IsNullOrEmpty(input.dzzrtc), p => p.Dzzrtc.Equals(input.dzzrtc))
.WhereIF(!string.IsNullOrEmpty(input.zrtc), p => p.Zrtc.Equals(input.zrtc))
.WhereIF(!string.IsNullOrEmpty(input.dztc2), p => p.Dztc2.Equals(input.dztc2))
.WhereIF(!string.IsNullOrEmpty(input.zjltc), p => p.Zjltc.Equals(input.zjltc))
.WhereIF(!string.IsNullOrEmpty(input.jltc), p => p.Jltc.Equals(input.jltc))
.WhereIF(!string.IsNullOrEmpty(input.yjtc), p => p.Yjtc.Equals(input.yjtc))
.WhereIF(!string.IsNullOrEmpty(input.xhtc), p => p.Xhtc.Equals(input.xhtc))
.WhereIF(!string.IsNullOrEmpty(input.kjbzctc), p => p.Kjbzctc.Equals(input.kjbzctc))
.WhereIF(!string.IsNullOrEmpty(input.sytc), p => p.Sytc.Equals(input.sytc))
.WhereIF(!string.IsNullOrEmpty(input.celltc), p => p.Celltc.Equals(input.celltc))
.WhereIF(!string.IsNullOrEmpty(input.dxmbtc), p => p.Dxmbtc.Equals(input.dxmbtc))
.WhereIF(!string.IsNullOrEmpty(input.tchj), p => p.Tchj.Equals(input.tchj))
.WhereIF(!string.IsNullOrEmpty(input.jksdx), p => p.Jksdx.Equals(input.jksdx))
.WhereIF(!string.IsNullOrEmpty(input.dzhudx), p => p.Dzhudx.Equals(input.dzhudx))
.WhereIF(!string.IsNullOrEmpty(input.dzhangdx), p => p.Dzhangdx.Equals(input.dzhangdx))
.WhereIF(!string.IsNullOrEmpty(input.zrdx), p => p.Zrdx.Equals(input.zrdx))
.WhereIF(!string.IsNullOrEmpty(input.dzzrdx), p => p.Dzzrdx.Equals(input.dzzrdx))
.WhereIF(!string.IsNullOrEmpty(input.zjldx), p => p.Zjldx.Equals(input.zjldx))
.WhereIF(!string.IsNullOrEmpty(input.jldx), p => p.Jldx.Equals(input.jldx))
.WhereIF(!string.IsNullOrEmpty(input.kjblsdx), p => p.Kjblsdx.Equals(input.kjblsdx))
.WhereIF(!string.IsNullOrEmpty(input.dxmbdx), p => p.Dxmbdx.Equals(input.dxmbdx))
.WhereIF(!string.IsNullOrEmpty(input.dxhj), p => p.Dxhj.Equals(input.dxhj))
.WhereIF(!string.IsNullOrEmpty(input.sg), p => p.Sg.Equals(input.sg))
.WhereIF(!string.IsNullOrEmpty(input.rtjl), p => p.Rtjl.Equals(input.rtjl))
.WhereIF(!string.IsNullOrEmpty(input.sjgl), p => p.Sjgl.Equals(input.sjgl))
.WhereIF(!string.IsNullOrEmpty(input.cb), p => p.Cb.Equals(input.cb))
.WhereIF(!string.IsNullOrEmpty(input.sx), p => p.Sx.Equals(input.sx))
.WhereIF(!string.IsNullOrEmpty(input.qq), p => p.Qq.Equals(input.qq))
.WhereIF(!string.IsNullOrEmpty(input.hsyfgz), p => p.Hsyfgz.Equals(input.hsyfgz))
.WhereIF(!string.IsNullOrEmpty(input.bd), p => p.Bd.Equals(input.bd))
.WhereIF(!string.IsNullOrEmpty(input.bdqj), p => p.Bdqj.Equals(input.bdqj))
.WhereIF(!string.IsNullOrEmpty(input.bddx), p => p.Bddx.Equals(input.bddx))
.WhereIF(!string.IsNullOrEmpty(input.bdbc), p => p.Bdbc.Equals(input.bdbc))
.WhereIF(!string.IsNullOrEmpty(input.zzyfgz), p => p.Zzyfgz.Equals(input.zzyfgz))
.WhereIF(!string.IsNullOrEmpty(input.dypxbt), p => p.Dypxbt.Equals(input.dypxbt))
.WhereIF(!string.IsNullOrEmpty(input.dyjtbt), p => p.Dyjtbt.Equals(input.dyjtbt))
.WhereIF(!string.IsNullOrEmpty(input.sypxbt), p => p.Sypxbt.Equals(input.sypxbt))
.WhereIF(!string.IsNullOrEmpty(input.syjtbt), p => p.Syjtbt.Equals(input.syjtbt))
.WhereIF(!string.IsNullOrEmpty(input.bthj), p => p.Bthj.Equals(input.bthj))
.WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
.WhereIF(!string.IsNullOrEmpty(input.cd), p => p.Cd.Equals(input.cd))
.WhereIF(!string.IsNullOrEmpty(input.qj), p => p.Qj.Equals(input.qj))
.WhereIF(!string.IsNullOrEmpty(input.ksb), p => p.Ksb.Equals(input.ksb))
.WhereIF(!string.IsNullOrEmpty(input.kcjl), p => p.Kcjl.Equals(input.kcjl))
.WhereIF(!string.IsNullOrEmpty(input.kzs), p => p.Kzs.Equals(input.kzs))
.WhereIF(!string.IsNullOrEmpty(input.kxxq), p => p.Kxxq.Equals(input.kxxq))
.WhereIF(!string.IsNullOrEmpty(input.kgzf), p => p.Kgzf.Equals(input.kgzf))
.WhereIF(!string.IsNullOrEmpty(input.kkhj), p => p.Kkhj.Equals(input.kkhj))
.WhereIF(!string.IsNullOrEmpty(input.fjj), p => p.Fjj.Equals(input.fjj))
.WhereIF(!string.IsNullOrEmpty(input.tsjyj), p => p.Tsjyj.Equals(input.tsjyj))
.WhereIF(!string.IsNullOrEmpty(input.tzsyj), p => p.Tzsyj.Equals(input.tzsyj))
.WhereIF(!string.IsNullOrEmpty(input.sfgz), p => p.Sfgz.Equals(input.sfgz))
.WhereIF(!string.IsNullOrEmpty(input.dysfff), p => p.Dysfff.Contains(input.dysfff))
.WhereIF(!string.IsNullOrEmpty(input.zfje), p => p.Zfje.Equals(input.zfje))
.WhereIF(!string.IsNullOrEmpty(input.dzjfe), p => p.Dzjfe.Equals(input.dzjfe))
.WhereIF(!string.IsNullOrEmpty(input.bfsy), p => p.Bfsy.Equals(input.bfsy))
.WhereIF(!string.IsNullOrEmpty(input.dyzfze), p => p.Dyzfze.Equals(input.dyzfze))
.Select(it=> new LqGzListOutput
{
id = it.Id,
md=it.Md,
hsgw=it.Hsgw,
xm=it.Xm,
jsjzd=it.Jsjzd,
zyj=it.Zyj,
jcyj=it.Jcyj,
hzyj=it.Hzyj,
jlyj=it.Jlyj,
mdzyj=it.Mdzyj,
dwyj=it.Dwyj,
zb=it.Zb,
xkyj=it.Xkyj,
xkcjl=it.Xkcjl,
xktd=it.Xktd,
sdyj=it.Sdyj,
sdtd=it.Sdtd,
syyj=it.Syyj,
cellyj=it.Cellyj,
dxmybyj=it.Dxmybyj,
dxmebyj=it.Dxmebyj,
dyyj=it.Dyyj,
wysd=it.Wysd,
mdzc=it.Mdzc,
cpwl=it.Cpwl,
wdcb=it.Wdcb,
qthzcb=it.Qthzcb,
xmj=it.Xmj,
ml=it.Ml,
zjltce=it.Zjltce,
jltce=it.Jltce,
xh=it.Xh,
xms=it.Xms,
ddrt=it.Ddrt,
zdts=it.Zdts,
qjts=it.Qjts,
td=it.Td,
jcyjtc=it.Jcyjtc,
hzyjtc=it.Hzyjtc,
gwtc=it.Gwtc,
mdtqtc=it.Mdtqtc,
dztc1=it.Dztc1,
dzzrtc=it.Dzzrtc,
zrtc=it.Zrtc,
dztc2=it.Dztc2,
zjltc=it.Zjltc,
jltc=it.Jltc,
yjtc=it.Yjtc,
xhtc=it.Xhtc,
kjbzctc=it.Kjbzctc,
sytc=it.Sytc,
celltc=it.Celltc,
dxmbtc=it.Dxmbtc,
tchj=it.Tchj,
jksdx=it.Jksdx,
dzhudx=it.Dzhudx,
dzhangdx=it.Dzhangdx,
zrdx=it.Zrdx,
dzzrdx=it.Dzzrdx,
zjldx=it.Zjldx,
jldx=it.Jldx,
kjblsdx=it.Kjblsdx,
dxmbdx=it.Dxmbdx,
dxhj=it.Dxhj,
sg=it.Sg,
rtjl=it.Rtjl,
sjgl=it.Sjgl,
cb=it.Cb,
sx=it.Sx,
qq=it.Qq,
hsyfgz=it.Hsyfgz,
bd=it.Bd,
bdqj=it.Bdqj,
bddx=it.Bddx,
bdbc=it.Bdbc,
zzyfgz=it.Zzyfgz,
dypxbt=it.Dypxbt,
dyjtbt=it.Dyjtbt,
sypxbt=it.Sypxbt,
syjtbt=it.Syjtbt,
bthj=it.Bthj,
qk=it.Qk,
cd=it.Cd,
qj=it.Qj,
ksb=it.Ksb,
kcjl=it.Kcjl,
kzs=it.Kzs,
kxxq=it.Kxxq,
kgzf=it.Kgzf,
kkhj=it.Kkhj,
fjj=it.Fjj,
tsjyj=it.Tsjyj,
tzsyj=it.Tzsyj,
sfgz=it.Sfgz,
dysfff=it.Dysfff,
zfje=it.Zfje,
dzjfe=it.Dzjfe,
bfsy=it.Bfsy,
dyzfze=it.Dyzfze,
}).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
return data;
}
///
/// 导出工资全字段
///
/// 请求参数
///
[HttpGet("Actions/Export")]
public async Task Export([FromQuery] LqGzListQueryInput 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\":\"md\"},{\"value\":\"核算岗位\",\"field\":\"hsgw\"},{\"value\":\"姓名\",\"field\":\"xm\"},{\"value\":\"金山角战队\",\"field\":\"jsjzd\"},{\"value\":\"基础业绩\",\"field\":\"jcyj\"},{\"value\":\"合作业绩\",\"field\":\"hzyj\"},{\"value\":\"奖励业绩\",\"field\":\"jlyj\"},{\"value\":\"门店总业绩\",\"field\":\"mdzyj\"},{\"value\":\"队伍业绩\",\"field\":\"dwyj\"},{\"value\":\"占比\",\"field\":\"zb\"},{\"value\":\"新客业绩\",\"field\":\"xkyj\"},{\"value\":\"新客成交率\",\"field\":\"xkcjl\"},{\"value\":\"新客提点\",\"field\":\"xktd\"},{\"value\":\"升单业绩\",\"field\":\"sdyj\"},{\"value\":\"升单提点\",\"field\":\"sdtd\"},{\"value\":\"溯源业绩\",\"field\":\"syyj\"},{\"value\":\"cell业绩\",\"field\":\"cellyj\"},{\"value\":\"项目一部业绩\",\"field\":\"dxmybyj\"},{\"value\":\"项目二部业绩\",\"field\":\"dxmebyj\"},{\"value\":\"当月业绩\",\"field\":\"dyyj\"},{\"value\":\"物业水电\",\"field\":\"wysd\"},{\"value\":\"门店支出\",\"field\":\"mdzc\"},{\"value\":\"产品物料\",\"field\":\"cpwl\"},{\"value\":\"微雕成本\",\"field\":\"wdcb\"},{\"value\":\"其它合作成本\",\"field\":\"qthzcb\"},{\"value\":\"洗毛巾\",\"field\":\"xmj\"},{\"value\":\"毛利\",\"field\":\"ml\"},{\"value\":\"总经理提成额\",\"field\":\"zjltce\"},{\"value\":\"经理提成额\",\"field\":\"jltce\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"到店人头\",\"field\":\"ddrt\"},{\"value\":\"在店天数\",\"field\":\"zdts\"},{\"value\":\"请假天数\",\"field\":\"qjts\"},{\"value\":\"提点\",\"field\":\"td\"},{\"value\":\"基础业绩提成\",\"field\":\"jcyjtc\"},{\"value\":\"合作业绩提成\",\"field\":\"hzyjtc\"},{\"value\":\"顾问提成\",\"field\":\"gwtc\"},{\"value\":\"门店T区提成\",\"field\":\"mdtqtc\"},{\"value\":\"店助提成\",\"field\":\"dztc1\"},{\"value\":\"店助主任提成\",\"field\":\"dzzrtc\"},{\"value\":\"主任提成\",\"field\":\"zrtc\"},{\"value\":\"店长提成\",\"field\":\"dztc2\"},{\"value\":\"总经理提成\",\"field\":\"zjltc\"},{\"value\":\"经理提成\",\"field\":\"jltc\"},{\"value\":\"业绩提成\",\"field\":\"yjtc\"},{\"value\":\"消耗提成\",\"field\":\"xhtc\"},{\"value\":\"科技部组长提成\",\"field\":\"kjbzctc\"},{\"value\":\"溯源提成\",\"field\":\"sytc\"},{\"value\":\"cell提成\",\"field\":\"celltc\"},{\"value\":\"大项目部提成\",\"field\":\"dxmbtc\"},{\"value\":\"提成合计\",\"field\":\"tchj\"},{\"value\":\"健康师底薪\",\"field\":\"jksdx\"},{\"value\":\"店助底薪\",\"field\":\"dzhudx\"},{\"value\":\"店长底薪\",\"field\":\"dzhangdx\"},{\"value\":\"主任底薪\",\"field\":\"zrdx\"},{\"value\":\"店助主任底薪\",\"field\":\"dzzrdx\"},{\"value\":\"总经理底薪\",\"field\":\"zjldx\"},{\"value\":\"经理底薪\",\"field\":\"jldx\"},{\"value\":\"科技部底薪\",\"field\":\"kjblsdx\"},{\"value\":\"大项目部底薪\",\"field\":\"dxmbdx\"},{\"value\":\"底薪合计\",\"field\":\"dxhj\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"人头奖励\",\"field\":\"rtjl\"},{\"value\":\"手机管理\",\"field\":\"sjgl\"},{\"value\":\"车补\",\"field\":\"cb\"},{\"value\":\"少休\",\"field\":\"sx\"},{\"value\":\"全勤\",\"field\":\"qq\"},{\"value\":\"核算应发工资\",\"field\":\"hsyfgz\"},{\"value\":\"保底\",\"field\":\"bd\"},{\"value\":\"保底请假\",\"field\":\"bdqj\"},{\"value\":\"保底底薪\",\"field\":\"bddx\"},{\"value\":\"保底补差\",\"field\":\"bdbc\"},{\"value\":\"最终应发工资\",\"field\":\"zzyfgz\"},{\"value\":\"当月培训补贴\",\"field\":\"dypxbt\"},{\"value\":\"当月交通补贴\",\"field\":\"dyjtbt\"},{\"value\":\"上月培训补贴\",\"field\":\"sypxbt\"},{\"value\":\"上月交通补贴\",\"field\":\"syjtbt\"},{\"value\":\"补贴合计\",\"field\":\"bthj\"},{\"value\":\"缺卡\",\"field\":\"qk\"},{\"value\":\"迟到\",\"field\":\"cd\"},{\"value\":\"请假\",\"field\":\"qj\"},{\"value\":\"扣社保\",\"field\":\"ksb\"},{\"value\":\"扣除奖励\",\"field\":\"kcjl\"},{\"value\":\"扣住宿\",\"field\":\"kzs\"},{\"value\":\"扣学习期\",\"field\":\"kxxq\"},{\"value\":\"扣工作服\",\"field\":\"kgzf\"},{\"value\":\"扣款合计\",\"field\":\"kkhj\"},{\"value\":\"发奖金\",\"field\":\"fjj\"},{\"value\":\"退手机押金\",\"field\":\"tsjyj\"},{\"value\":\"退住宿押金\",\"field\":\"tzsyj\"},{\"value\":\"实发工资\",\"field\":\"sfgz\"},{\"value\":\"当月是否发放\",\"field\":\"dysfff\"},{\"value\":\"支付金额\",\"field\":\"zfje\"},{\"value\":\"待支付金额\",\"field\":\"dzjfe\"},{\"value\":\"补发上月\",\"field\":\"bfsy\"},{\"value\":\"当月支付总额\",\"field\":\"dyzfze\"},{\"value\":\"总业绩\",\"field\":\"zyj\"},]".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;
}
///
/// 批量删除工资全字段
///
/// 主键数组
///
[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();
//关闭事务
_db.CommitTran();
}
catch (Exception)
{
//回滚事务
_db.RollbackTran();
throw NCCException.Oh(ErrorCode.COM1002);
}
}
}
///
/// 更新工资全字段
///
/// 主键
/// 参数
///
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] LqGzUpInput input)
{
var entity = input.Adapt();
var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
}
///
/// 删除工资全字段
///
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
}
#region 业绩计算相关方法
///
/// 计算个人业绩数据
///
///
/// 根据薪酬规则计算个人的基础业绩、合作业绩、奖励业绩、门店总业绩、队伍业绩等
///
/// 计算逻辑:
/// 1. 基础业绩:从开单品项明细表中统计,基于项目资料中的基础服务提成
/// 2. 合作业绩:从开单品项明细表中统计,基于项目资料中的合作项目设置
/// 3. 奖励业绩:从奖励明细表中统计
/// 4. 门店总业绩:该员工所在门店的所有业绩总和
/// 5. 队伍业绩:该员工所在金三角战队的所有业绩总和
///
/// 示例请求:
/// ```json
/// {
/// "employeeId": "员工ID",
/// "storeId": "门店ID",
/// "calculationMonth": "2025-01"
/// }
/// ```
///
/// 参数说明:
/// - employeeId: 员工ID(必填)
/// - storeId: 门店ID(必填)
/// - calculationMonth: 计算月份,格式:YYYYMM(必填)
///
/// 业绩计算输入参数
/// 业绩计算结果
/// 成功返回业绩计算结果
/// 参数错误或数据不存在
/// 服务器内部错误
[HttpPost("CalculatePerformance")]
public async Task CalculatePerformance([FromBody] PerformanceCalculationInput input)
{
try
{
_logger.LogInformation($"开始计算员工业绩 - 员工ID: {input.EmployeeId}, 门店ID: {input.StoreId}, 月份: {input.CalculationMonth}");
var result = new PerformanceCalculationOutput
{
EmployeeId = input.EmployeeId,
StoreId = input.StoreId,
CalculationMonth = input.CalculationMonth
};
// 1. 计算基础业绩
result.BasicPerformance = await CalculateBasicPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
// 2. 计算合作业绩
result.CooperationPerformance = await CalculateCooperationPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
// 3. 计算奖励业绩
result.RewardPerformance = await CalculateRewardPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
// 4. 计算总业绩
result.TotalPerformance = result.BasicPerformance + result.CooperationPerformance + result.RewardPerformance;
// 5. 计算门店总业绩
result.StoreTotalPerformance = await CalculateStoreTotalPerformance(input.StoreId, input.CalculationMonth);
// 6. 计算队伍业绩
result.TeamPerformance = await CalculateTeamPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
// 7. 计算占比
result.PerformanceRatio = result.StoreTotalPerformance > 0 ?
Math.Round(result.TotalPerformance / result.StoreTotalPerformance * 100, 2) : 0;
_logger.LogInformation($"业绩计算完成 - 员工ID: {input.EmployeeId}, 总业绩: {result.TotalPerformance}, 门店总业绩: {result.StoreTotalPerformance}");
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, $"计算员工业绩失败 - 员工ID: {input.EmployeeId}, 门店ID: {input.StoreId}");
throw NCCException.Oh(ErrorCode.COM1005, "业绩计算失败");
}
}
///
/// 计算基础业绩
///
private async Task CalculateBasicPerformance(string employeeId, string storeId, string calculationMonth)
{
var startDate = DateTime.Parse($"{calculationMonth}-01");
var endDate = startDate.AddMonths(1).AddDays(-1);
// 从开单品项明细表中统计基础业绩
var basicPerformance = await _db.Queryable()
.LeftJoin((px, xm) => px.Px == xm.Xmbh)
.LeftJoin((px, xm, kd) => px.Glkdbh == kd.Id)
.Where((px, xm, kd) =>
kd.Djmd == storeId &&
kd.Kdrq >= startDate &&
kd.Kdrq <= endDate &&
(px.Px == employeeId || px.Px.Contains(employeeId))) // 根据实际情况调整匹配条件
.SumAsync((px, xm, kd) => px.Pxjg * xm.Jcfwtc / 100);
return basicPerformance;
}
///
/// 计算合作业绩
///
private async Task CalculateCooperationPerformance(string employeeId, string storeId, string calculationMonth)
{
var startDate = DateTime.Parse($"{calculationMonth}-01");
var endDate = startDate.AddMonths(1).AddDays(-1);
// 从开单品项明细表中统计合作业绩
var cooperationPerformance = await _db.Queryable()
.LeftJoin((px, xm) => px.Px == xm.Xmbh)
.LeftJoin((px, xm, kd) => px.Glkdbh == kd.Id)
.Where((px, xm, kd) =>
kd.Djmd == storeId &&
kd.Kdrq >= startDate &&
kd.Kdrq <= endDate &&
kd.Hgjg != null && kd.Hgjg != "" && // 有合作机构
(px.Px == employeeId || px.Px.Contains(employeeId)))
.SumAsync((px, xm, kd) => px.Pxjg * 0.65m); // 合作业绩按65%计算
return cooperationPerformance;
}
///
/// 计算奖励业绩
///
private async Task CalculateRewardPerformance(string employeeId, string storeId, string calculationMonth)
{
// 从奖励明细表中统计奖励业绩
var rewardPerformance = await _db.Queryable()
.Where(jl =>
jl.Mdbh == storeId &&
jl.Jks == employeeId &&
jl.Hj != null && jl.Hj != "")
.SumAsync(jl => Convert.ToDecimal(jl.Hj));
return rewardPerformance;
}
///
/// 计算门店总业绩
///
private async Task CalculateStoreTotalPerformance(string storeId, string calculationMonth)
{
var startDate = DateTime.Parse($"{calculationMonth}-01");
var endDate = startDate.AddMonths(1).AddDays(-1);
// 从开单记录表中统计门店总业绩
var storeTotalPerformance = await _db.Queryable()
.Where(kd =>
kd.Djmd == storeId &&
kd.Kdrq >= startDate &&
kd.Kdrq <= endDate)
.SumAsync(kd => kd.Zdyj);
return storeTotalPerformance;
}
///
/// 计算队伍业绩
///
private async Task CalculateTeamPerformance(string employeeId, string storeId, string calculationMonth)
{
// 先获取员工所在的金三角战队
var goldenTriangle = await _db.Queryable()
.Where(jsj =>
jsj.Md == storeId &&
jsj.Yf == calculationMonth &&
jsj.Jsj.Contains(employeeId))
.FirstAsync();
if (goldenTriangle == null)
{
return 0; // 没有加入金三角战队
}
var startDate = DateTime.Parse($"{calculationMonth}-01");
var endDate = startDate.AddMonths(1).AddDays(-1);
// 统计该战队所有成员的业绩
var teamPerformance = await _db.Queryable()
.Where(kd =>
kd.Djmd == storeId &&
kd.Kdrq >= startDate &&
kd.Kdrq <= endDate &&
goldenTriangle.Jsj.Contains(kd.Jsj))
.SumAsync(kd => kd.Zdyj);
return teamPerformance;
}
///
/// 批量更新工资表中的业绩数据
///
///
/// 批量更新指定月份所有员工的业绩数据
///
/// 示例请求:
/// ```json
/// {
/// "calculationMonth": "2025-01",
/// "storeIds": ["门店ID1", "门店ID2"]
/// }
/// ```
///
/// 参数说明:
/// - calculationMonth: 计算月份,格式:YYYYMM(必填)
/// - storeIds: 门店ID列表(可选,为空则更新所有门店)
///
/// 批量更新参数
/// 更新结果
/// 成功更新业绩数据
/// 参数错误
/// 服务器内部错误
[HttpPost("BatchUpdatePerformance")]
public async Task BatchUpdatePerformance([FromBody] BatchUpdatePerformanceInput input)
{
try
{
_logger.LogInformation($"开始批量更新业绩数据 - 月份: {input.CalculationMonth}");
var updatedCount = 0;
var errorCount = 0;
// 获取需要更新的工资记录
var salaryRecords = await _db.Queryable()
.WhereIF(input.StoreIds != null && input.StoreIds.Any(), gz => input.StoreIds.Contains(gz.Md))
.ToListAsync();
foreach (var record in salaryRecords)
{
try
{
// 计算该员工的业绩数据
var performanceInput = new PerformanceCalculationInput
{
EmployeeId = record.Xm, // 使用姓名作为员工标识
StoreId = record.Md,
CalculationMonth = input.CalculationMonth
};
var performance = await CalculatePerformance(performanceInput);
// 更新工资记录
record.Jcyj = performance.BasicPerformance;
record.Hzyj = performance.CooperationPerformance;
record.Jlyj = performance.RewardPerformance;
record.Zyj = performance.TotalPerformance;
record.Mdzyj = performance.StoreTotalPerformance;
record.Dwyj = performance.TeamPerformance;
record.Zb = performance.PerformanceRatio;
await _db.Updateable(record)
.UpdateColumns(gz => new {
gz.Jcyj, gz.Hzyj, gz.Jlyj, gz.Zyj,
gz.Mdzyj, gz.Dwyj, gz.Zb
})
.ExecuteCommandAsync();
updatedCount++;
}
catch (Exception ex)
{
_logger.LogError(ex, $"更新员工业绩失败 - 员工: {record.Xm}, 门店: {record.Md}");
errorCount++;
}
}
_logger.LogInformation($"批量更新业绩数据完成 - 成功: {updatedCount}, 失败: {errorCount}");
return new
{
Success = true,
UpdatedCount = updatedCount,
ErrorCount = errorCount,
Message = $"成功更新 {updatedCount} 条记录,失败 {errorCount} 条记录"
};
}
catch (Exception ex)
{
_logger.LogError(ex, $"批量更新业绩数据失败 - 月份: {input.CalculationMonth}");
throw NCCException.Oh(ErrorCode.COM1005, "批量更新业绩数据失败");
}
}
#endregion
}
}