You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

579 lines
25 KiB

/*
*SellOrder
*/
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Linq;
using VOL.Core.BaseProvider;
using VOL.Core.Enums;
using VOL.Core.Extensions;
using VOL.Core.ManageUser;
using VOL.Core.UserManager;
using VOL.Core.Utilities;
using VOL.Core.WorkFlow;
using VOL.Entity.DomainModels;
using VOL.Order.IRepositories;
using VOL.Order.Repositories;
namespace VOL.Order.Services
{
public partial class SellOrderService
{
public string GetServiceDate()
{
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss");
}
//此SellOrderService.cs类由代码生成器生成默认是没有任何代码如果需要写业务代码请在此类中实现
//如果默认的增、删、改、查、导入、导出、审核满足不了业务,请参考下面的方法进行业务代码扩展(扩展代码是对ServiceFunFilter.cs的实现)
WebResponseContent webResponse = new WebResponseContent();
private IHttpContextAccessor _httpContextAccessor;
private ISellOrderRepository _repository;
[ActivatorUtilitiesConstructor]
public SellOrderService(IHttpContextAccessor httpContextAccessor, ISellOrderRepository repository)
: base(repository)
{
_httpContextAccessor = httpContextAccessor;
_repository = repository;
//2020.08.15
//开启数据隔离功能,开启后会对查询、导出、删除、编辑功能同时生效
//如果只需要对某个功能生效,如编辑,则在重写编辑方法中设置 IsMultiTenancy = true;
// IsMultiTenancy = true;
}
//将前端table组件提交的查询参数转换为表达式
public IQueryable<SellOrder> Test(PageDataOptions options)
{
////1、对象转换为字符串
//Sys_User user = new Sys_User();
//string userText= user.Serialize();
////2、字符串转换为对象(上面的json字符串userText转换为对象)
//user = userText.DeserializeObject<Sys_User>();
////list对象序列化与反序列化
//List<Sys_User> list = new List<Sys_User>();
//list.Add(new Sys_User() { UserName = "test" });
//userText = list.Serialize();
////字符串转换为对象(上面的json字符串userText转换为对象)
//list = userText.DeserializeObject<List<Sys_User>>();
//options.Wheres;为前端提交的查询条件
//手动获取查询条件
//List<SearchParameters> parameters= options.Wheres.DeserializeObject<List<SearchParameters>>();
IQueryable<SellOrder> query = base.GetPageDataQueryFilter(options);
//或者调用其他表的转换
//SellOrderService.Instance.GetPageDataQueryFilter(options);
return query;
}
/// <summary>
/// 2023.02.03增加or查询条件示例
/// 注意如果有导出功能GetPageData方法内的代码在下面的export方法里需要同样的复制一份
/// </summary>
/// <param name="options"></param>
/// <returns></returns>
//public override PageGridData<SellOrder> GetPageData(PageDataOptions options)
//{
// System.Linq.Expressions.Expression<Func<SellOrder, bool>> orFilter = null;
// QueryRelativeList = (List<SearchParameters> parameters) =>
// {
// //方式1动态生成or查询条件
// foreach (var item in parameters)
// {
// if (!string.IsNullOrEmpty(item.Value))
// {
// if (orFilter == null&&(item.Name == "TranNo"|| item.Name == "SellNo")){ orFilter = x => false; }
// //注意:这里只需要判断or查询的字段其他的字段不需要处理
// //这里必须拷贝value值
// string value = item.Value;
// if (item.Name == "TranNo")
// {
// //进行or模糊查询
// orFilter = orFilter.Or(x => x.TranNo.Contains(value));
// //清空原来的数据
// item.Value = null;
// }
// else if (item.Name == "SellNo")
// {
// //进行or等于查询
// orFilter = orFilter.Or(x => x.SellNo == value);
// //清空原来的数据
// item.Value = null;
// }
// }
// }
// ///方式2原生sql查询,需要自己处理sql注入问题(不建议使用此方法)
// //string sql = null;
// //foreach (var item in parameters)
// //{
// // if (!string.IsNullOrEmpty(item.Value))
// // {
// // if (sql == null)
// // {
// // sql = "where 1=2";
// // }
// // string value = item.Value;
// // //清空原来的数据
// // item.Value = null;
// // if (item.Name == "TranNo")
// // {
// // sql += $" or TranNo='{value}'";
// // //清空原来的数据
// // item.Value = null;
// // }
// // else if (item.Name == "SellNo")
// // {
// // sql += $" or SellNo='{value}'";
// // }
// // }
// //}
// //QuerySql = "select * from sellorder " + sql;
// };
// QueryRelativeExpression = (IQueryable<SellOrder> queryable) =>
// {
// if (orFilter != null)
// {
// queryable = queryable.Where(orFilter);
// }
// return queryable;
// };
// return base.GetPageData(options);
//}
//查询
public override PageGridData<SellOrder> GetPageData(PageDataOptions options)
{
//options.Value可以从前台查询的方法提交一些其他参数放到value里面
//前端提交方式见文档组件api->viewgrid组件里面的searchBefore方法
object extraValue = options.Value;
//此处是从前台提交的原生的查询条件,这里可以自己过滤
QueryRelativeList = (List<SearchParameters> parameters) =>
{
};
//2020.08.15
//设置原生查询的sql语句这里必须返回select * 表所有字段
//(先内部过滤数据,内部调用EF方法FromSqlRaw,自己写的sql注意sql注入的问题不会影响界面上提交的查询
/*
* string date = DateTime.Now.AddYears(-10).ToString("yyyy-MM-dd");
QuerySql = $@"select * from SellOrder
where createdate>'{date}'
and Order_Id in (select Order_Id from SellOrderList)
and CreateID={UserContext.Current.UserId}";
*/
//2020.08.15
//此处与上面QuerySql只需要实现其中一个就可以了
//查询前可以自已设定查询表达式的条件
QueryRelativeExpression = (IQueryable<SellOrder> queryable) =>
{
//当前用户只能操作自己(与下级角色)创建的数据,如:查询、删除、修改等操作
//IQueryable<int> userQuery = RoleContext.GetCurrentAllChildUser();
//queryable = queryable.Where(x => x.CreateID == UserContext.Current.UserId || userQuery.Contains(x.CreateID ?? 0));
return queryable;
};
//指定多个字段进行排序
OrderByExpression = x => new Dictionary<object, QueryOrderBy>() {
{ x.CreateDate,QueryOrderBy.Desc },
{ x.SellNo,QueryOrderBy.Asc}
};
//int a = 1;
////指定多个字段按条件进行排序需要2021.07.04更新LambdaExtensions类后才能使用
//OrderByExpression = x => new Dictionary<object, QueryOrderBy>() {
// { x.CreateDate,QueryOrderBy.Desc },
// { x.SellNo,a==1?QueryOrderBy.Desc:QueryOrderBy.Asc}
//};
//查询完成后,在返回页面前可对查询的数据进行操作
GetPageDataOnExecuted = (PageGridData<SellOrder> grid) =>
{
//可对查询的结果的数据操作
List<SellOrder> sellOrders = grid.rows;
};
//查询table界面显示求和
SummaryExpress = (IQueryable<SellOrder> queryable) =>
{
return queryable.GroupBy(x => 1).Select(x => new
{
//AvgPrice注意大小写和数据库字段大小写一样
Qty = x.Sum(o => o.Qty).ToString("f2")
})
.FirstOrDefault();
};
return base.GetPageData(options);
}
/// <summary>
/// 设置弹出框明细表的合计信息
/// </summary>
/// <typeparam name="detail"></typeparam>
/// <param name="queryeable"></param>
/// <returns></returns>
protected override object GetDetailSummary<detail>(IQueryable<detail> queryeable)
{
return (queryeable as IQueryable<SellOrderList>).GroupBy(x => 1).Select(x => new
{
//Weight/Qty注意大小写和数据库字段大小写一样
Weight = x.Sum(o => o.Weight),
Qty = x.Sum(o => o.Qty)
}).FirstOrDefault();
}
/// <summary>
/// 查询业务代码编写(从表(明细表查询))
/// </summary>
/// <param name="pageData"></param>
/// <returns></returns>
public override object GetDetailPage(PageDataOptions pageData)
{
//自定义查询胆细表
////明细表自定义查询方式一EF
//var query = SellOrderListRepository.Instance.IQueryablePage<SellOrderList>(
// pageData.Page,
// pageData.Rows,
// out int count,
// x => x.Order_Id == pageData.Value.GetGuid(),
// orderBy: x => new Dictionary<object, QueryOrderBy>() { { x.CreateDate, QueryOrderBy.Desc } }
// );
//PageGridData<SellOrderList> detailGrid = new PageGridData<SellOrderList>();
//detailGrid.rows = query.ToList();
//detailGrid.total = count;
////明细表自定义查询方式二dapper
//string sql = "select count(1) from SellOrderList where Order_Id=@orderId";
//detailGrid.total = repository.DapperContext.ExecuteScalar(sql, new { orderId = pageData.Value }).GetInt();
//sql = @$"select * from (
// select *,ROW_NUMBER()over(order by createdate desc) as rowId
// from SellOrderList where Order_Id=@orderId
// ) as s where s.rowId between {((pageData.Page - 1) * pageData.Rows + 1)} and {pageData.Page * pageData.Rows} ";
//detailGrid.rows = repository.DapperContext.QueryList<SellOrderList>(sql, new { orderId = pageData.Value });
//return detailGrid;
return base.GetDetailPage(pageData);
}
/// <summary>
/// 新建
/// </summary>
/// <param name="saveDataModel"></param>
/// <returns></returns>
public override WebResponseContent Add(SaveModel saveDataModel)
{
//此处saveModel是从前台提交的原生数据可对数据进修改过滤
AddOnExecute = (SaveModel saveModel) =>
{
//如果返回false,后面代码不会再执行
return webResponse.OK();
};
// 在保存数据库前的操作,所有数据都验证通过了,这一步执行完就执行数据库保存
AddOnExecuting = (SellOrder order, object list) =>
{
//明细表对象
List<SellOrderList> orderLists = list as List<SellOrderList>;
//自定义逻辑
if (orderLists == null || orderLists.Count == 0)
{//如果没有界面上没有填写明细,则中断执行
return webResponse.Error("必须填写明细数据");
}
if (orderLists.Exists(x => x.Qty <= 20))
return webResponse.Error("明细数量必须大于20");
//设置webResponse.Code = "-1"会中止后面代码执行,与返回 webResponse.Error()一样,区别在于前端提示的是成功或失败
//webResponse.Code = "-1";
// webResponse.Message = "测试强制返回";
//return webResponse.OK("ok");
return webResponse.OK();
};
//此方法中已开启了事务,如果在此方法中做其他数据库操作,请不要再开启事务
// 在保存数据库后的操作此时已进行数据提交但未提交事务如果返回false则会回滚提交
AddOnExecuted = (SellOrder order, object list) =>
{
//明细表对象
// List<SellOrderList> orderLists = list as List<SellOrderList>;
if (order.Qty < 10)
{ //如果输入的销售数量<10会回滚数据库
return webResponse.Error("销售数量必须大于1000");
}
return webResponse.OK("已新建成功,台AddOnExecuted方法返回的消息");
};
//新建的数据进入审批流程前处理,
AddWorkFlowExecuting = (SellOrder order) =>
{
//返回false当前数据不会进入审批流程
return true;
};
//新建的数据写入审批流程后,第二个参数为审批人的用户id
AddWorkFlowExecuted = (SellOrder order, List<int> userIds) =>
{
//这里可以做发邮件通知
//var userInfo = repository.DbContext.Set<Sys_User>()
// .Where(x => userIds.Contains(x.User_Id))
// .Select(s => new { s.User_Id, s.UserTrueName, s.Email, s.PhoneNo }).ToList();
//发送邮件方法
//MailHelper.Send()
};
return base.Add(saveDataModel);
}
/// <summary>
/// 编辑操作
/// </summary>
/// <param name="saveModel"></param>
/// <returns></returns>
public override WebResponseContent Update(SaveModel saveModel)
{
//注意:如果要给其他字段设置值,请在此处设置,如代码生成器上将字段编辑行设置为0然后点生成model
//saveModel.MainData["字段"] = "值";
//此处saveModel是从前台提交的原生数据可对数据进修改过滤
UpdateOnExecute = (SaveModel model) =>
{
////这里的设置配合下面order.Remark = "888"代码位置使用
// saveModel.MainData.TryAdd("Remark", "1231");
//如果不想前端提交某些可以编辑的字段的值,直接移除字段
// saveModel.MainData.Remove("字段");
//如果返回false,后面代码不会再执行
return webResponse.OK();
};
//编辑方法保存数据库前处理
UpdateOnExecuting = (SellOrder order, object addList, object updateList, List<object> delKeys) =>
{
if (order.TranNo == "2019000001810001")
{
//如果设置code=-1会强制返回不再继续后面的操作,2021.07.04更新LambdaExtensions文件后才可以使用此属性
//webResponse.Code = "-1";
// webResponse.Message = "测试强制返回";
//return webResponse.OK();
return webResponse.Error("不能更新此[" + order.TranNo + "]单号");
}
////如果要手动设置某些字段的值,值不是前端提交的代码生成器里面编辑行必须设置为0并生成model,如Remark字段:
////注意必须设置上面saveModel.MainData.TryAdd("Remark", "1231")
//order.Remark = "888";
//新增的明细表
List<SellOrderList> add = addList as List<SellOrderList>;
//修改的明细表
List<SellOrderList> update = updateList as List<SellOrderList>;
//删除明细表Id
var guids = delKeys?.Select(x => (Guid)x);
//设置webResponse.Code = "-1"会中止后面代码执行,与返回 webResponse.Error()一样,区别在于前端提示的是成功或失败
//webResponse.Code = "-1";
// webResponse.Message = "测试强制返回";
//return webResponse.OK("ok");
return webResponse.OK();
};
//编辑方法保存数据库后处理
//此方法中已开启了事务,如果在此方法中做其他数据库操作,请不要再开启事务
// 在保存数据库后的操作此时已进行数据提交但未提交事务如果返回false则会回滚提交
UpdateOnExecuted = (SellOrder order, object addList, object updateList, List<object> delKeys) =>
{
//新增的明细
List<SellOrderList> add = addList as List<SellOrderList>;
//修改的明细
List<SellOrderList> update = updateList as List<SellOrderList>;
//删除的行的主键
var guids = delKeys?.Select(x => (Guid)x);
return webResponse.OK();
};
return base.Update(saveModel);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="keys">删除的行的主键</param>
/// <param name="delList">删除时是否将明细也删除</param>
/// <returns></returns>
public override WebResponseContent Del(object[] keys, bool delList = true)
{
//删除前处理
//删除的行的主键
DelOnExecuting = (object[] _keys) =>
{
return webResponse.OK();
};
//删除后处理
//删除的行的主键
DelOnExecuted = (object[] _keys) =>
{
return webResponse.OK();
};
return base.Del(keys, delList);
}
public override WebResponseContent Audit(object[] keys, int? auditStatus, string auditReason)
{
//status当前审批状态,lastAudit是否最后一个审批节点
AuditWorkFlowExecuting = (SellOrder order, AuditStatus status, bool lastAudit) =>
{
return webResponse.OK();
};
//status当前审批状态,nextUserIds下一个节点审批人的帐号id(可以从sys_user表中查询用户具体信息),lastAudit是否最后一个审批节点
AuditWorkFlowExecuted = (SellOrder order, AuditStatus status, List<int> nextUserIds, bool lastAudit) =>
{
//lastAudit=true时流程已经结束
if (!lastAudit)
{
//这里可以给下一批审批发送邮件通知
//var userInfo = repository.DbContext.Set<Sys_User>()
// .Where(x => nextUserIds.Contains(x.User_Id))
// .Select(s => new { s.User_Id, s.UserTrueName, s.Email, s.PhoneNo }).ToList();
}
//审批流程回退功能,回到第一个审批人重新审批(重新生成审批流程)
//if (status==AuditStatus.审核未通过||status==AuditStatus.驳回)
//{
// base.RewriteFlow(order);
//}
return webResponse.OK();
};
//审核保存前处理(不是审批流程)
AuditOnExecuting = (List<SellOrder> order) =>
{
return webResponse.OK();
};
//审核后处理(不是审批流程)
AuditOnExecuted = (List<SellOrder> order) =>
{
return webResponse.OK();
};
return base.Audit(keys, auditStatus, auditReason);
}
/// <summary>
/// 导出
/// </summary>
/// <param name="pageData"></param>
/// <returns></returns>
public override WebResponseContent Export(PageDataOptions pageData)
{
//设置最大导出的数量
Limit = 1000;
//指定导出的字段(2020.05.07)
ExportColumns = x => new { x.SellNo, x.TranNo, x.CreateDate };
//查询要导出的数据后在生成excel文件前处理
//list导出的实体ignore过滤不导出的字段
ExportOnExecuting = (List<SellOrder> list, List<string> ignore) =>
{
return webResponse.OK();
};
return base.Export(pageData);
}
/// <summary>
/// 下载模板(导入时弹出框中的下载模板)(2020.05.07)
/// </summary>
/// <returns></returns>
public override WebResponseContent DownLoadTemplate()
{
//指定导出模板的字段,如果不设置DownLoadTemplateColumns默认导出查所有页面上能看到的列(2020.05.07)
DownLoadTemplateColumns = x => new { x.SellNo, x.TranNo, x.Remark, x.CreateDate };
return base.DownLoadTemplate();
}
/// <summary>
/// 导入
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
public override WebResponseContent Import(List<IFormFile> files)
{
//(2020.05.07)
//设置导入的字段(如果指定了上面导出模板的字段这里配置应该与上面DownLoadTemplate方法里配置一样)
//如果不设置导入的字段DownLoadTemplateColumns,默认显示所有界面上所有可以看到的字段
DownLoadTemplateColumns = x => new { x.SellNo, x.TranNo, x.Remark, x.CreateDate };
/// <summary>
/// 2022.06.20增加原生excel读取方法(导入时可以自定义读取excel内容)
/// string=当前读取的excel单元格的值
/// ExcelWorksheet=excel对象
/// ExcelRange当前excel单元格对象
/// int=当前读取的第几行
/// int=当前读取的第几列
/// string=返回的值
/// </summary>
ImportOnReadCellValue = (string value, ExcelWorksheet worksheet, ExcelRange excelRange, int rowIndex, int columnIndex) =>
{
string = worksheet.Cells[1, columnIndex].Value?.ToString();
//这里可以返回处理后的值值最终写入到model字段上
return value;
};
//导入保存前处理(可以对list设置新的值)
ImportOnExecuting = (List<SellOrder> list) =>
{
//设置webResponse.Code = "-1"会中止后面代码执行,与返回 webResponse.Error()一样,区别在于前端提示的是成功或失败
//webResponse.Code = "-1";
//webResponse.Message = "测试强制返回";
//return webResponse.OK("ok");
return webResponse.OK();
};
//导入后处理(已经写入到数据库了)
ImportOnExecuted = (List<SellOrder> list) =>
{
return webResponse.OK();
};
return base.Import(files);
}
public override WebResponseContent Upload(List<IFormFile> files)
{
//自定义上传文件路径(目前只支持配置相对路径默认上传到wwwwroot下)
//2022.10.07更新ServiceBase.cs、ServiceFunFilter.cs后才能使用
UploadFolder = $"test/{DateTime.Now.ToString("yyyyMMdd")}";
return base.Upload(files);
}
}
}