翼度科技»论坛 编程开发 .net 查看内容

C#TMS系统学习(联表报表)

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
C#TMS系统代码-联表报表学习

领导被裁了之后很快就有人上任了,几乎是无缝衔接,很难让我不想到这早就决定好了。我的职责没有任何变化。感受下来这个系统封装程度很高,我只要会调用方法就行。这个系统交付之后不会有太多问题,更多应该是做小需求,有大的开发任务应该也是第二期的事,嗯?怎么感觉我变成运维了?而且为啥没有技术主管来把把关呢?做好了之后我就直接接手了
还有另外一个PLM系统还没有开发好,只能先着手这个了,不然天天看上去没事做
whatcanisay
费用结算查询-客户汇总

统计客户发货单/寄递单 产生的费用
之前没怎么使用过mysql中的pivot,所以对这里的ToPivotTable()不清楚,花些时间了解一下挺好
  1. //获取报表为啥这里是Post,我只能猜测因为参数太多然后不想把参数放在url上面?
  2. [HttpPost("GetCustomerReport")]
  3. //这个控制器或动作方法不需要身份验证或授权
  4. [AllowAnonymous]
  5. //省略日志记录
  6. [IgnoreLog]
  7. //[FromBody]-请求正文,看来参数真的很多了
  8. public async Task<dynamic> GetCustomerReport([FromBody] TmsBusiCustomerReportListQueryInput input)
  9. {
  10.     //获取数据权限
  11.     //50733 id为表的主键
  12.     //整个系统都是用这个id直接去查,为什么不搞一个枚举类呢?
  13.     var authorizeWhere = new List<IConditionalModel>();
  14.     authorizeWhere = await _userManager.GetConditionAsync<TmsBusiCustomerReportOutput>("50733", "it.F_Id");
  15.     //获取登录人CompanyCode
  16.     var loginUserCompany = new List<string>();
  17.     if (!_userManager.IsAdministrator)
  18.     {
  19.         loginUserCompany = await _repository.Context.Queryable<TmsBaseCompanyEmployeeEntity>().Where(x => x.DeleteMark == null && x.EnabledMark == 1 && x.UserId == _userManager.UserId).GroupBy(x => x.CompanyCode).Select(x => x.CompanyCode).ToListAsync();
  20.     }
  21.     //获取字典项费用类型为一般费用的id
  22.     var dictionarydata = await _repository.Context.Queryable<DictionaryDataEntity>().Where(it => it.DictionaryTypeId == "5183653" && it.DeleteMark == null && it.EnabledMark == 1 && it.FullName == "一般费用").Select(it => it.Id).FirstAsync();
  23.     //获取费用明细
  24.     var CostCheckDetailData = GetData();
  25.     //开查
  26.     //TmsBaseExpenseEntity => 费用类型(跟 费用明细 的 费用类型 不是同一个)
  27.     var data = _db.Queryable<TmsBaseExpenseEntity>()
  28.         //左连接 费用类型=>a 费用明细=>d 条件:费用类型Code = 费用明细的费用代码
  29.         .LeftJoin(CostCheckDetailData, (a, d) => a.Code == d.F_ExpenseCode)
  30.         //内连接 费用单=>it(费用单与费用明细为主子关系) 条件:费用单Id = 费用明细主表Id
  31.         //连一个加一个,不过取名...我也不好说...叫我来取我估计我直接abcdef按顺序来了
  32.         .InnerJoin<TmsBusiCostCheckEntity>((a, d, it) => it.Id == d.F_CostId)
  33.         //左连接 寄递单=>b 条件:寄递单单号 = 费用单的来源单号
  34.         .LeftJoin<TmsBusiMailingDeliveryEntity>((a, d, it, b) => b.No == it.SourceNo)
  35.         //左连接 付款明细=>e 条件:费用单单号 = 付款明细的取货单号(数据字典里这样写的,应该叫来源单号吧?费用怎么取货呢?)
  36.         .LeftJoin<TmsBuisPaymentDetailEntity>((a, d, it, b, e) => it.No == e.PickupNo)
  37.         //左连接 付款单=>f(付款单与付款明细为主子表关系) 条件:付款单Id = 付款明细主表Id
  38.         .LeftJoin<TmsBusiPaymentEntity>((a, d, it, b, e, f) => e.PaymentId == f.Id)
  39.         //左连接 取货单=>j 条件:取货单单号 = 费用单的来源单号
  40.         .LeftJoin<TmsBusiPickupEntity>((a, d, it, b, e, f, j) => it.SourceNo == j.No)
  41.         //费用单状态
  42.         .Where((a, d, it, b, e, f, j) => it.Status == 2)
  43.         //加上数据权限
  44.         .Where(authorizeWhere)
  45.         //删除是修改删除标记来实现,所以这里要查 非删除单据
  46.         .Where((a, d, it, b, e, f, j) => a.DeleteMark == null && d.F_DeleteMark == null && it.DeleteMark == null && b.DeleteMark == null && e.DeleteMark == null && f.DeleteMark == null && j.DeleteMark == null)
  47.         //费用明细 的 费用类型 = 一般费用 (费用明细里面的 费用类型 跟 费用代码 没有任何关系)
  48.         .Where((a, d, it, b, e, f, j) => d.F_ExpenseType == dictionarydata)
  49.         //管理员查看全部,其他看本公司数据
  50.         .WhereIF(!_userManager.IsAdministrator, (a, d, it, b, e, f, j) => loginUserCompany.Contains(it.CompanyNo))
  51.         //groupby一下,报表是按照使用客户来分组的
  52.         .GroupBy((a, d, it, b, e, f, j) => new
  53.         {
  54.           it.CompanyName,
  55.           it.CustomerName,
  56.           f.Currency,
  57.           a.Code,
  58.         })
  59.         //select数据成TmsBusiCustomerReportOutput
  60.         .Select((a, d, it, b, e, f, j) => new TmsBusiCustomerReportOutput
  61.               {
  62.           companyName = it.CompanyName,
  63.           customerName =SqlFunc.IIF(it.CustomerName.Contains(".,"), SqlFunc.Replace(it.CustomerName, ".,", ".,"), it.CustomerName),
  64.           ......
  65.           netWeight = SqlFunc.AggregateSum(it.SourceNo.Contains("JD") ? b.NetWeight : j.NetWeight),
  66.           code = a.Code,
  67.           amount = Convert.ToDecimal(SqlFunc.AggregateSum(it.Amount))
  68.         })
  69.         //别忘记MergeTable,一般用了select之后就要想起来
  70.         .MergeTable()
  71.         .WhereIF(!string.IsNullOrEmpty(input.companyName), a => a.companyName.Contains(input.companyName))
  72.         //一大堆查询条件
  73.         ......
  74.         .WhereIF(!string.IsNullOrEmpty(input.amountMin) && !string.IsNullOrEmpty(input.amountMax), a => SqlFunc.Between(a.amount, input.amountMin, input.amountMax))
  75.         //Pivot 行转列 直接看接口方法
  76.         //DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
  77.         //三个参数
  78.         //columnSelector 行转成的扩列
  79.         //rowSelector 保留列
  80.         //dataSelector 数值列(对应扩列的数据,所以sum)
  81.         //个人理解就是把 code的值变成列了,例子随便写的
  82.         /*
  83.                 之前是
  84.                 companyName  customerName    code       discountAmount
  85.             公司01        客户01          费用code01   1
  86.             公司01        客户01          费用code02   1
  87.             公司01        客户01          费用code03   1
  88.             
  89.             变成了
  90.             companyName  customerName  费用code01  费用code02  费用code03
  91.             公司01        客户01         1          1          1   
  92.                        
  93.                         这里的1是sum(discountAmount),因为这里只有一条
  94.         */
  95.         .ToPivotTable(it => it.code, it => new
  96.         {
  97.             it.companyName,
  98.             it.customerName,
  99.             ......
  100.             it.amount
  101.          }, it => it.Sum(x => x.discountAmount)
  102.          );
  103.     //排除结算币种为空
  104.     DataRow[] foundRow;
  105.     foundRow = data.Select("currency=''");
  106.     foreach (var item in foundRow)
  107.     {
  108.         data.Rows.Remove(item);
  109.     }
  110.     //保存一下
  111.     data.AcceptChanges();
  112.     //下面都是分页操作 List放数据,totalCount总条数
  113.     var list = new List<Dictionary<string, object?>>();
  114.     var totalCount = 0;
  115.     //数据放进List
  116.     foreach (DataRow dr in data.Rows)
  117.     {
  118.         var result = new Dictionary<string, object?>();
  119.         foreach (DataColumn dc in data.Columns)
  120.         {
  121.             result.Add(dc.ColumnName, dr[dc]);
  122.         }
  123.         totalCount++;
  124.         list.Add(result);
  125.     }
  126.         //排序
  127.     if (!string.IsNullOrEmpty(input.sidx))
  128.     {
  129.         switch (input.sidx)
  130.         {
  131.             case "companyName":
  132.             case "customerCode":
  133.             case "customerName":
  134.             case "currency":
  135.                 if (input.sort == "desc")
  136.                     list = list.OrderByDescending(x => x[input.sidx]?.ToString()).ToList();
  137.                 else
  138.                     list = list.OrderBy(x => x[input.sidx]?.ToString()).ToList();
  139.                 break;
  140.             default:
  141.                 if (input.sort == "desc")
  142.                     list = list.OrderByDescending(x => x[input.sidx].ObjToDecimal()).ToList();
  143.                 else
  144.                     list = list.OrderBy(x => x[input.sidx].ObjToDecimal()).ToList();
  145.                 break;
  146.         }
  147.     }
  148.     //获取当页内容放入list
  149.     list = list.Skip(input.pageSize * (input.currentPage - 1)).Take(input.pageSize).ToList();
  150.         //组装数据返回前台
  151.     return new { pagination = new { pageIndex = input.currentPage, input.pageSize, total = totalCount }, list = list };
  152. }
复制代码
来源:https://www.cnblogs.com/fanwenkeer/p/18191232
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具