/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Auth;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 表单 接口实现
///
public class CoreCmsFormServices : BaseServices, ICoreCmsFormServices
{
private readonly ICoreCmsFormRepository _dal;
private readonly ICoreCmsFormItemRepository _itemRepository;
private readonly ICoreCmsFormSubmitServices _formSubmitServices;
private readonly ICoreCmsFormSubmitDetailServices _formSubmitDetailServices;
private readonly ICoreCmsProductsServices _productsServices;
private readonly ICoreCmsAreaServices _areaServices;
private IHttpContextAccessor _httpContextAccessor;
private readonly ICoreCmsGoodsServices _goodsServices;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsFormServices(IUnitOfWork unitOfWork, ICoreCmsFormRepository dal, ICoreCmsFormItemRepository itemRepository, ICoreCmsGoodsServices goodsServices, ICoreCmsFormSubmitServices formSubmitServices, IHttpContextAccessor httpContextAccessor, ICoreCmsAreaServices areaServices, ICoreCmsFormSubmitDetailServices formSubmitDetailServices, ICoreCmsProductsServices productsServices)
{
this._dal = dal;
_itemRepository = itemRepository;
_goodsServices = goodsServices;
_formSubmitServices = formSubmitServices;
_httpContextAccessor = httpContextAccessor;
_areaServices = areaServices;
_formSubmitDetailServices = formSubmitDetailServices;
_productsServices = productsServices;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
///
/// 重写异步插入方法
///
/// 实体数据
///
public async Task InsertAsync(FMForm entity)
{
return await _dal.InsertAsync(entity);
}
///
/// 重写异步更新方法方法
///
///
///
public async Task UpdateAsync(FMForm entity)
{
return await _dal.UpdateAsync(entity);
}
///
/// 重写删除指定ID的数据
///
///
///
public async Task DeleteByIdAsync(int id)
{
return await _dal.DeleteByIdAsync(id);
}
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
///
/// 获取form表单详情
///
///
///
///
///
public async Task GetFormInfo(int id, string token, bool noToken = false)
{
var jm = new WebApiCallBack();
if (id == 0)
{
jm.msg = GlobalErrorCodeVars.Code10051;
jm.status = false;
return jm;
}
var formModel = await _dal.QueryByIdAsync(id);
if (formModel == null)
{
jm.msg = GlobalErrorCodeVars.Code18008;
return jm;
}
var dt = DateTime.Now;
//检查过期时间
if (formModel.endDateTime < dt && noToken == false)
{
jm.msg = GlobalErrorCodeVars.Code18002;
jm.data = new
{
isExpires = true,
needLogin = false
};
return jm;
}
//如果是后台,则不验证token
if (noToken)
{
formModel.isLogin = false;
}
if (formModel.isLogin && string.IsNullOrEmpty(token))
{
jm.msg = GlobalErrorCodeVars.Code14006;
jm.data = new
{
needLogin = true,
isExpires = false,
};
return jm;
}
else if (formModel.isLogin && !string.IsNullOrEmpty(token))
{
var userId = TokenHelper.GetUserIdBySecurityToken(token);
jm.otherData = userId;
if (userId <= 0)
{
jm.msg = GlobalErrorCodeVars.Code14006;
jm.data = new
{
needLogin = true,
isExpires = false,
};
return jm;
}
}
var items = await _itemRepository.QueryListByClauseAsync(p => p.formId == formModel.id, p => p.sort, OrderByType.Asc);
foreach (var item in items)
{
if (item.type == GlobalEnumVars.FormFieldTypes.goods.ToString())
{
if (noToken == false)
{
var goodId = Convert.ToInt32(item.value);
if (goodId > 0)
{
item.good = await _goodsServices.GetGoodsDetail(goodId, 0, false, "goods", 0, true);
}
}
}
else if (item.type == GlobalEnumVars.FormFieldTypes.radio.ToString())
{
item.radioValue = item.value.Split(",").ToList();
}
else if (item.type == GlobalEnumVars.FormFieldTypes.checbox.ToString())
{
var valueArray = item.value.Split(",");
var defaultArray = item.defaultValue.Split(",");
var tempCheckbox = new List();
foreach (var v in valueArray)
{
var t = new TempCheckbox { @checked = defaultArray.Contains(v), value = v };
tempCheckbox.Add(t);
}
item.checkboxValue = tempCheckbox;
}
else if (item.type == GlobalEnumVars.FormFieldTypes.date.ToString())
{
//没有值的时候设置下默认值
if (string.IsNullOrEmpty(item.defaultValue))
{
item.defaultValue = dt.ToString("yyyy-MM-hh");
}
}
else if (item.type == GlobalEnumVars.FormFieldTypes.time.ToString())
{
//没有值的时候设置下默认值
if (string.IsNullOrEmpty(item.defaultValue))
{
item.defaultValue = dt.ToString("HH:mm");
}
}
}
formModel.Items = items;
jm.status = true;
jm.code = 0;
jm.data = formModel;
jm.msg = "获取成功";
return jm;
}
///
/// 重写删除指定ID集合的数据(批量删除)
///
///
///
public async Task AddSubmit(FmAddSubmit entity)
{
var jm = new WebApiCallBack();
jm.msg = GlobalErrorCodeVars.Code18001;
var formModel = await _dal.QueryByIdAsync(entity.id);
if (formModel == null)
{
jm.msg = GlobalErrorCodeVars.Code18008;
return jm;
}
if (formModel.isLogin && string.IsNullOrEmpty(entity.token))
{
jm.msg = GlobalErrorCodeVars.Code14006;
jm.data = new
{
needLogin = true
};
return jm;
}
var dt = DateTime.Now;
//检查过期时间
if (formModel.endDateTime < dt)
{
jm.msg = GlobalErrorCodeVars.Code18002;
return jm;
}
decimal money = 0;
//todo 金额促销
//付款码
if (formModel.type == (int)GlobalEnumVars.FormTypes.付款码)
{
var items = await _itemRepository.QueryListByClauseAsync(p => p.formId == formModel.id && p.type == GlobalEnumVars.FormFieldTypes.money.ToString());
if (items.Any())
{
items.ForEach(p =>
{
var post = entity.data.Find(o => o.key == p.id);
money += (decimal)(post?.value.ObjectToFloat(0) ?? 0);
});
}
}
var userId = 0;
if (!string.IsNullOrEmpty(entity.token))
{
userId = TokenHelper.GetUserIdBySecurityToken(entity.token);
}
//判断提交次数
if (formModel.times > 0 && !string.IsNullOrEmpty(entity.token))
{
if (userId <= 0)
{
jm.msg = GlobalErrorCodeVars.Code18012;
return jm;
}
var count = await _formSubmitServices.GetCountAsync(p => p.userId == userId && p.formId == formModel.id);
if (count >= formModel.times)
{
jm.msg = GlobalErrorCodeVars.Code18003;
return jm;
}
}
try
{
_unitOfWork.BeginTran();
var formSubmitModel = new CoreCmsFormSubmit();
formSubmitModel.formId = formModel.id;
formSubmitModel.formName = formModel.name;
formSubmitModel.userId = userId;
formSubmitModel.money = money;
formSubmitModel.payStatus = false;
formSubmitModel.status = false;
formSubmitModel.createTime = DateTime.Now;
formSubmitModel.ip = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
var formSubmitId = await _formSubmitServices.InsertReturnIdentityAsync(formSubmitModel);
if (formSubmitId <= 0)
{
_unitOfWork.RollbackTran();
jm.msg = GlobalErrorCodeVars.Code18005;
return jm;
}
if (entity.data.Count > 0)
{
//根据提交的数据取字段列表(已废弃)
//var formitemIds = entity.data.Select(p => p.key).ToList();
//var formItems = await _itemRepository.QueryListByClauseAsync(p => formitemIds.Contains(p.id));
//查询表单展示字段
var formItems = await _itemRepository.QueryListByClauseAsync(p => p.formId == formModel.id, p => p.sort, OrderByType.Asc);
var sDetails = new List();
//遍历表单字段项
foreach (var item in formItems)
{
//获取提交的哪些
var postItem = entity.data.Find(p => p.key == item.id);
if (postItem == null)
{
_unitOfWork.RollbackTran();
jm.msg = item.name + GlobalErrorCodeVars.Code18020;
return jm;
}
string value = postItem.value;
//验证数据格式
if (FormHelper.ValidateField(item.validationType, postItem.value))
{
_unitOfWork.RollbackTran();
}
//如果必填但数据为空。
if (item.required && string.IsNullOrEmpty(postItem.value))
{
_unitOfWork.RollbackTran();
jm.msg = GlobalErrorCodeVars.Code18006 + item.name;
return jm;
}
//验证地区
if (item.type == GlobalEnumVars.FormFieldTypes.area.ToString() && !string.IsNullOrEmpty(postItem.value))
{
//var arr = postItem.value.Split(" ");
//var countyName = arr[2];
//var cityName = arr[1];
//var provinceName = arr[0];
//var areaId = await _areaServices.GetThreeAreaId(provinceName, cityName, countyName, "");
//value = areaId.ToString();
value = postItem.value;
}
if (item.type == GlobalEnumVars.FormFieldTypes.goods.ToString() && !string.IsNullOrEmpty(postItem.value))
{
var goods = JsonConvert.DeserializeObject>(postItem.value);
if (goods.Any())
{
foreach (var good in goods)
{
var product = await _productsServices.GetProductInfo(good.productId, false, 0);
if (product == null)
{
_unitOfWork.RollbackTran();
jm.msg = GlobalErrorCodeVars.Code12501;
return jm;
}
var formItemName = !string.IsNullOrEmpty(product.spesDesc)
? product.spesDesc + "/" + product.sn
: product.sn;
money += product.price * good.nums;
var sDetail = new CoreCmsFormSubmitDetail();
sDetail.submitId = formSubmitId;
sDetail.formId = formModel.id;
sDetail.formItemId = item.id;
sDetail.formItemName = formItemName;
sDetail.formItemValue = good.nums.ToString();
sDetails.Add(sDetail);
}
}
}
else
{
var sDetail = new CoreCmsFormSubmitDetail();
sDetail.submitId = formSubmitId;
sDetail.formId = formModel.id;
sDetail.formItemId = item.id;
sDetail.formItemName = item.name;
sDetail.formItemValue = value;
sDetails.Add(sDetail);
}
}
var sDetailResult = await _formSubmitDetailServices.InsertAsync(sDetails);
if (sDetailResult <= 0)
{
_unitOfWork.RollbackTran();
jm.msg = GlobalErrorCodeVars.Code18007;
return jm;
}
}
if (formModel.type == (int)GlobalEnumVars.FormTypes.订单)
{
//订单类型时,更新提交表单金额
await _formSubmitServices.UpdateAsync(p => new CoreCmsFormSubmit() { money = money }, p => p.id == formSubmitId);
}
jm.data = new
{
formSubmitId,
money
};
_unitOfWork.CommitTran();
jm.status = true;
jm.msg = "提交成功";
}
catch (Exception e)
{
_unitOfWork.RollbackTran();
jm.status = false;
jm.msg = "操作异常";
jm.data = e;
}
return jm;
}
}
}