Bläddra i källkod

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

xf 2 veckor sedan
förälder
incheckning
f50c5e617e

+ 71 - 2
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -612,8 +612,24 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("centre_data_list")]
         public async Task<List<OrderBiCentreDataListVo>> CentreDataList([FromQuery] ReportPagedRequest dto)
         {
-            var query = _orderApplication.CentreDataList(dto);
+            ISugarQueryable<OrderBiCentreDataListVo> query;
+            if (_appOptions.Value.IsZiGong)
+                query = _orderApplication.CentreDataListZG(dto);
+            else
+                query = _orderApplication.CentreDataList(dto);
+
             var list = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
+            if (_appOptions.Value.IsZiGong)
+            {
+                list.Add(new OrderBiCentreDataListVo
+                {
+                    UserName = "合计",
+                    CentreArchive = list.Select(s => s.CentreArchive).Sum(),
+                    CentreCareOf = list.Select(s => s.CentreCareOf).Sum(),
+                    NoCentreCareOf = list.Select(s => s.NoCentreCareOf).Sum(),
+                    Subtotal = list.Select(s => s.Subtotal).Sum()
+                });
+            }
             return list;
         }
 
@@ -626,7 +642,13 @@ namespace Hotline.Api.Controllers.Bi
         [LogFilterAlpha("导出日志")]
         public async Task<FileStreamResult> CentreDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
         {
-            var query = _orderApplication.CentreDataList(dto.QueryDto);
+            ISugarQueryable<OrderBiCentreDataListVo> query;
+            if (_appOptions.Value.IsZiGong)
+                query = _orderApplication.CentreDataListZG(dto.QueryDto);
+            else
+                query = _orderApplication.CentreDataList(dto.QueryDto);
+
+            //var query = _orderApplication.CentreDataList(dto.QueryDto);
             List<OrderBiCentreDataListVo> data = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
             data.Add(new OrderBiCentreDataListVo
             {
@@ -648,6 +670,53 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "话务员办件统计");
         }
 
+        /// <summary>
+        /// 话务员办件统计明细列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("centre_data_list_detail")]
+        public async Task<PagedDto<OrderDto>> CentreDataListDetailExport([FromQuery] CentreDataListDetailRequest dto)
+        {
+            var (total, items) = await _orderApplication.CentreDataListDetailZG(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
+            return new PagedDto<OrderDto>(total, _mapper.Map<List<OrderDto>>(items));
+        }
+
+        /// <summary>
+        /// 话务员办件统计明细列表--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("centre_data_list_detail_export")]
+        [LogFilterAlpha("导出日志")]
+        public async Task<FileStreamResult> CentreDataListDetailExport([FromBody] ExportExcelDto<CentreDataListDetailRequest> dto)
+        {
+            var query = _orderApplication.CentreDataListDetailZG(dto.QueryDto);
+            List<Order> orders;
+            if (dto.IsExportAll)
+            {
+                orders = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                orders = items;
+            }
+
+            var orderDtos = _mapper.Map<ICollection<OrderDto>>(orders);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "话务员办件统计明细列表");
+        }
+
         /// <summary>
         /// 工单业务量统计
         /// </summary>

+ 2 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -820,6 +820,8 @@ public class OrderController : BaseController
             OrderTitle = order.Title,
             Content = order.Content,
             ActualOpinion = order.FileOpinion,
+            IsPublic = order.IsPublic,
+            IsProvincePublic = (order.SourceChannelCode == "SZMHD" && order.IsProvince == true) ? true :false,
             NetizenEvaluateType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.NetizenEvaluateType)
                 .Select(x => new Kv { Key = x.DicDataValue, Value = x.DicDataName }).ToList()
         };

+ 1 - 1
src/Hotline.Application/Exam/Service/ExamManages/ExamManageService.cs

@@ -604,7 +604,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             var expression = queryRequest.GetExpression();
             var questionTable = _repository.Queryable().Where(expression);
 
-            var queryable = questionTable.Select(e => new ExamManageViewResponse
+            var queryable = questionTable.OrderBy(e => e.CreationTime).Select(e => new ExamManageViewResponse
             {
                 Id = e.Id,
                 Code = e.Code,

+ 128 - 100
src/Hotline.Application/Exam/Service/ExamManages/UserExamService.cs

@@ -46,6 +46,8 @@ using Hotline.Exams.Questions;
 using Hotline.Exams.Sourcewares;
 using Hotline.Share.Dtos.Questions;
 using DocumentFormat.OpenXml.Office2010.Excel;
+using System.Linq.Expressions;
+using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
 
 namespace Hotline.Application.Exam.Service.ExamManages
 {
@@ -359,7 +361,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 IsJoin = false
             };
 
-            if (userExam.StartTime == null || userExam.ExamStatus == EExamStatus.Complete)
+            if (userExam.ExamStatus == EExamStatus.NoStart || userExam.ExamStatus == EExamStatus.Complete)
                 userExam.StartTime = DateTime.Now;
 
             var startExamViewResponse = await CheckExamValid(userExam, cancellationToken);
@@ -618,6 +620,35 @@ namespace Hotline.Application.Exam.Service.ExamManages
         public async Task<List<GradingExamQuestionDto>> GetGradingExamQuestion(GradingExamRequest gradingExamRequest)
         {
             var expression = gradingExamRequest.GetExpression();
+
+            ISugarQueryable<GradingExamQuestionTempDto> queryable = GetViewExamQuestionTempDtos(expression);
+
+            queryable =
+            queryable.MergeTable().Where((q) => !(q.QuestionType == EQuestionType.Single || q.QuestionType == EQuestionType.Multi || q.QuestionType == EQuestionType.Judge));
+
+            var queryResult = await queryable.ToListAsync();
+
+            var gradingExamQuestionDtos = queryResult.GroupBy(x => new
+            {
+                Id = x.Id,
+                QuestionType = x.QuestionType
+            }).Select(g => new GradingExamQuestionDto
+            {
+                Answer = g.FirstOrDefault().Answer,
+                QuestionType = g.Key.QuestionType,
+                Id = g.Key.Id,
+                QuestionScore = g.FirstOrDefault().QuestionScore,
+                Score = g.FirstOrDefault().Score,
+                Title = g.FirstOrDefault().Title,
+                CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label).Distinct()) : g.FirstOrDefault()?.CorrectAnswer
+            }).ToList();
+
+            return gradingExamQuestionDtos;
+        }
+
+        private ISugarQueryable<GradingExamQuestionTempDto> GetViewExamQuestionTempDtos(Expression<Func<ExamUserExam,bool>> expression)
+        {
+           
             var userExamTable = _repository.Queryable().Where(expression);
 
             var questionScoreRepository = new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
@@ -630,14 +661,13 @@ namespace Hotline.Application.Exam.Service.ExamManages
             var testPaperItemAnswerTable = new ExamRepository<ExamQuestionAnswerBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
             var questionScoreTable = questionScoreRepository.Queryable();
 
-            var queryable = userExamTable.InnerJoin(userExamItemTable, (e, i) => e.Id == i.UserExamId)
-                .InnerJoin(questionTable, (e, i, q) => i.QuestionId == q.QuestionId)
+            return userExamTable.InnerJoin(userExamItemTable, (e, i) => e.Id == i.UserExamId)
+                .InnerJoin(questionTable, (e, i, q) => i.QuestionId == q.QuestionId && q.ExamId == e.ExamId )
                 .LeftJoin(userExamItemOptionTable, (e, i, q, o) => i.Id == o.UserExamItemId)
                 .LeftJoin(quesitonOptionTable, (e, i, q, o, qo) => o.QuestionOptionId == qo.Id)
                 .LeftJoin(examAnswerTable, (e, i, q, o, qo, a) => i.Id == a.UserExamItemId)
                 .LeftJoin(testPaperItemAnswerTable, (e, i, q, o, qo, a, ta) => ta.QuestionId == q.QuestionId)
                 .InnerJoin(questionScoreTable, (e, i, q, o, qo, a, ta, s) => q.QuestionType == s.QuestionType && e.ExamId == s.ExamManageId)
-            .Where((e, i, q, o, qo, a, ta, s) => !(q.QuestionType == EQuestionType.Single || q.QuestionType == EQuestionType.Multi || q.QuestionType == EQuestionType.Judge))
             .Select(
             (e, i, q, o, qo, a, ta, s) => new GradingExamQuestionTempDto
             {
@@ -647,6 +677,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 Answer = a.Id != null ? a.Answer : string.Empty,
                 Title = q.Title,
                 QuestionOptionId = o.Id,
+                QuestionId = q.QuestionId,
+                ExamQuestionId = q.Id,
                 UserExamItemId = i.Id,
                 Content = qo.Content,
                 Label = qo.Label,
@@ -656,28 +688,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 Score = i.Score
             }
                 );
-
-            var queryResult = await queryable.ToListAsync();
-
-            var gradingExamQuestionDtos = queryResult.GroupBy(x => new
-            {
-                Id = x.Id,
-                QuestionType = x.QuestionType
-            }).Select(g => new GradingExamQuestionDto
-            {
-                Answer = g.FirstOrDefault().Answer,
-                QuestionType = g.Key.QuestionType,
-                Id = g.Key.Id,
-                QuestionScore = g.FirstOrDefault().QuestionScore,
-                Score = g.FirstOrDefault().Score,
-                Title = g.FirstOrDefault().Title,
-                CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label).Distinct()) : g.FirstOrDefault()?.CorrectAnswer
-            }).ToList();
-
-            return gradingExamQuestionDtos;
         }
 
-
         public async Task<GradingExamQuestionDto> ViewGradingExamQuestion(ViewGradingExamRequest viewGradingExamRequest)
         {
             var gradingExtamItemDto = _mapper.Map<ViewGradingExamRequest, GradingExamItemDto>(viewGradingExamRequest);
@@ -835,6 +847,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                         QuestionId = u.QuestionId,
                         QuestionType = q.QuestionType,
                         UserExamId = u.UserExamId,
+                        Id = u.Id
                     }).Distinct().ToListAsync();
                 await CalcuteExamItemScore(_userExamItemRepository, userExamItemsInCheck, cancellationToken);
 
@@ -899,31 +912,24 @@ namespace Hotline.Application.Exam.Service.ExamManages
             var userExamIds = addUserExamItemDtos.Select(x => x.UserExamId).ToList();
             var questionTypes = addUserExamItemDtos.Select(x => x.QuestionType).ToList();
 
-            var testPaperItemOptionsRepository = new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            List<ExamQuestionOptionsBak> examQuestionOptions = await GetQuestionOptionBaks(questionIds, userExamIds,true).ToListAsync();
+
             var userExamItemOptionRepository = new ExamRepository<ExamUserExamItemOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
-            var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
-            var testPaperItemRepository = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
             var examQuestionScoreRepository = new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
-            var testPaperOptionsTable = testPaperItemOptionsRepository.Queryable().Where(x => questionIds.Contains(x.QuestionId) && x.IsAnswer);
-            var testPaperItemTable = testPaperItemRepository.Queryable().Where(x => x.QuestionType == EQuestionType.Single || x.QuestionType == EQuestionType.Multi || x.QuestionType == EQuestionType.Judge);
             var userExamTable = _repository.Queryable().Where(x => userExamIds.Contains(x.Id));
-            var examManageTable = examManageRepository.Queryable();
-            var testPaperOptionIds = await testPaperOptionsTable.InnerJoin(testPaperItemTable, (t, i) => t.ExamQuestionId == i.Id)
-                .InnerJoin(examManageTable, (t, i, e) => i.ExamId == e.Id)
-                .InnerJoin(userExamTable, (t, i, e, u) => e.Id == u.ExamId)
-                .Select((t, i, e, u) => t.Id).ToListAsync();
 
             var userExamItems = await userExamItemRepository.Queryable().Where(x => userExamIds.Contains(x.UserExamId)).ToListAsync();
             var userExamItemIds = userExamItems.Select(x => x.Id).ToList();
             var userExamItemOptions = await userExamItemOptionRepository.Queryable().Where(x => userExamItemIds.Contains(x.UserExamItemId)).ToListAsync();
             var examQuesiontScores = await examQuestionScoreRepository.Queryable().Where(x => questionTypes.Contains(x.QuestionType))
-                .InnerJoin(userExamTable, (e, u) => e.Id == u.ExamId)
+                .InnerJoin(userExamTable, (e, u) => e.ExamManageId == u.ExamId)
                 .Select((e, u) => e).ToListAsync();
 
 
             foreach (var addUserExamItemDto in addUserExamItemDtos)
             {
-                var isCorrect = userExamItemOptions.Select(x => x.QuestionOptionId).OrderBy(x => x).SequenceEqual(testPaperOptionIds.OrderBy(x => x));
+                var examQuestionOptionIds = examQuestionOptions.Where(x => x.QuestionId == addUserExamItemDto.QuestionId).Select(x => x.Id).ToList();
+                var isCorrect = userExamItemOptions.Where(x => x.UserExamItemId == addUserExamItemDto.Id).Select(x => x.QuestionOptionId).OrderBy(x => x).SequenceEqual(examQuestionOptionIds.OrderBy(x => x));
                 var userExamItem = userExamItems.FirstOrDefault(x => x.QuestionId == addUserExamItemDto.QuestionId);
                 if (userExamItem != null)
                 {
@@ -937,6 +943,32 @@ namespace Hotline.Application.Exam.Service.ExamManages
             await userExamItemRepository.UpdateWithValidateAsync(userExamItems, cancellationToken);
         }
 
+        private ISugarQueryable<ExamQuestionOptionsBak> GetQuestionOptionBaks(List<string> questionIds, List<string> userExamIds,bool isFilterAnswer)
+        {
+            var questionRepository = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            var questionTable = questionRepository.Queryable().Where(x => x.QuestionType == EQuestionType.Single || x.QuestionType == EQuestionType.Multi || x.QuestionType == EQuestionType.Judge);
+            var userExamTable = _repository.Queryable().Where(x => userExamIds.Contains(x.Id));
+            var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            var examManageTable = examManageRepository.Queryable();
+            var examQuestionOptionsRepository = new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            var examQuestionOptionsTable = examQuestionOptionsRepository.Queryable()
+                .Where(x => questionIds.Contains(x.QuestionId))
+                .WhereIF(isFilterAnswer,x=>x.IsAnswer);
+            var examQuestionOptions = examQuestionOptionsTable.InnerJoin(questionTable, (t, i) => t.ExamQuestionId == i.Id)
+                .InnerJoin(examManageTable, (t, i, e) => i.ExamId == e.Id)
+                .InnerJoin(userExamTable, (t, i, e, u) => e.Id == u.ExamId)
+                .Select((t, i, e, u) => new ExamQuestionOptionsBak
+                {
+                    Id = t.Id,
+                    Content = t.Content,
+                    IsAnswer = t.IsAnswer,
+                    Label = t.Label,
+                    ExamQuestionId = t.ExamQuestionId,
+                    QuestionId = t.QuestionId
+                });
+            return examQuestionOptions;
+        }
+
         private async Task CalcuteTotalScore(IUserExamItemRepository userExamItemRepository, string userExamId, CancellationToken cancellationToken)
         {
             var userExam = await _repository.GetAsync(x => x.Id == userExamId);
@@ -1327,31 +1359,18 @@ namespace Hotline.Application.Exam.Service.ExamManages
            
             List<ViewExamQuestionDto> viewExamQuestionDtos = await GetViewExamQuestion(id,null);
 
+            var examQuestionIds = viewExamQuestionDtos.Select(x => x.ExamQuestionId).ToList();
             var questionIds = viewExamQuestionDtos.Select(x => x.QuestionId).ToList();
-
-            List<ViewQuestionAnswerDto> questionAnswers = await GetQuestionAnswers(id, questionIds);
-            List<ViewQuestionOptionDto> questionOptions = await GetQuestionOptions( questionIds);
-            List<QuestionKnowladgeDto> questionKnowladges = await GetQuestionKnowladges( questionIds);
-            List<QuestionSourcewareDto> sourcewares = await GetSourcewares(questionIds);
-
-            viewExamQuestionDtos.ForEach(item =>
+            var userExamIds = new List<string>
             {
-                item.QuestionKnowladgeDtos = questionKnowladges.Where(x => x.QuestionId == item.QuestionId).ToList();
-                item.QuestionSourcewareDtos = sourcewares.Where(x => x.QuestionId == item.QuestionId).ToList();
-                if (!item.QuestionType.CheckSelectType())
-                {
-                    var questionAnswer = questionAnswers.FirstOrDefault(x => x.QuestionId == item.QuestionId);
-                    item.Answer = questionAnswer?.Answer ?? string.Empty;
-                    item.CorrectAnswer = questionAnswer?.CorrectAnswer ?? string.Empty;
-                }
-                else
-                {
-                    item.QuestionOptions = questionOptions.Where(x => x.QuestionId == item.QuestionId).ToList();
-                    item.CorrectAnswer = string.Join(",", item.QuestionOptions.Where(x => x.IsAnswer).Select(x => x.Label));
-                }
-                
-            });
+                id
+            };
+            //List<ViewQuestionAnswerDto> questionAnswers = await GetQuestionAnswers(id, questionIds);
+            List<ViewQuestionOptionDto> questionOptions = await GetQuestionOptions(questionIds, userExamIds);
+            List<QuestionKnowladgeDto> questionKnowladges = await GetQuestionKnowladges(examQuestionIds);
+            List<QuestionSourcewareDto> sourcewares = await GetSourcewares(examQuestionIds);
 
+            ResolveExamQuestions(viewExamQuestionDtos, questionOptions, questionKnowladges, sourcewares);
 
             return viewExamQuestionDtos;
 
@@ -1363,33 +1382,36 @@ namespace Hotline.Application.Exam.Service.ExamManages
         {
             List<ViewExamQuestionDto> viewExamQuestionDtos = await GetViewExamQuestion(id, questionId);
 
+            var examQuestionIds = viewExamQuestionDtos.Select(x => x.ExamQuestionId).ToList();
             var questionIds = viewExamQuestionDtos.Select(x => x.QuestionId).ToList();
+            var userExamIds = new List<string>
+            {
+                id
+            };
+            //List<ViewQuestionAnswerDto> questionAnswers = await GetQuestionAnswers(id, questionIds);
+            List<ViewQuestionOptionDto> questionOptions = await GetQuestionOptions(questionIds, userExamIds);
+            List<QuestionKnowladgeDto> questionKnowladges = await GetQuestionKnowladges(examQuestionIds);
+            List<QuestionSourcewareDto> sourcewares = await GetSourcewares(examQuestionIds);
+
+            ResolveExamQuestions(viewExamQuestionDtos, questionOptions, questionKnowladges, sourcewares);
 
-            List<ViewQuestionAnswerDto> questionAnswers = await GetQuestionAnswers(id, questionIds);
-            List<ViewQuestionOptionDto> questionOptions = await GetQuestionOptions(questionIds);
-            List<QuestionKnowladgeDto> questionKnowladges = await GetQuestionKnowladges(questionIds);
-            List<QuestionSourcewareDto> sourcewares = await GetSourcewares(questionIds);
+            return viewExamQuestionDtos.FirstOrDefault();
+        }
 
+        private static void ResolveExamQuestions(List<ViewExamQuestionDto> viewExamQuestionDtos, List<ViewQuestionOptionDto> questionOptions, List<QuestionKnowladgeDto> questionKnowladges, List<QuestionSourcewareDto> sourcewares)
+        {
             viewExamQuestionDtos.ForEach(item =>
             {
-                item.QuestionKnowladgeDtos = questionKnowladges.Where(x => x.QuestionId == item.QuestionId).ToList();
-                item.QuestionSourcewareDtos = sourcewares.Where(x => x.QuestionId == item.QuestionId).ToList();
-                if (!item.QuestionType.CheckSelectType())
+                item.QuestionKnowladgeDtos = questionKnowladges.Where(x => x.QuestionId == item.ExamQuestionId).ToList();
+                item.QuestionSourcewareDtos = sourcewares.Where(x => x.QuestionId == item.ExamQuestionId).ToList();
+                if (item.QuestionType.CheckSelectType())
                 {
-                    var questionAnswer = questionAnswers.FirstOrDefault(x => x.QuestionId == item.QuestionId);
-                    item.Answer = questionAnswer?.Answer ?? string.Empty;
-                    item.CorrectAnswer = questionAnswer?.CorrectAnswer ?? string.Empty;
-                }
-                else
-                {
-                    item.QuestionOptions = questionOptions.Where(x => x.QuestionId == item.QuestionId).ToList();
-                    item.CorrectAnswer = string.Join(",", item.QuestionOptions.Where(x => x.IsAnswer).Select(x => x.Label));
+                    item.QuestionOptions = questionOptions.Where(x => x.QuestionId == item.ExamQuestionId).ToList();
+
+                    item.CorrectAnswer = string.Join(",", item.QuestionOptions.Where(m => m.IsAnswer).Select(m => m.Label).ToArray());
                 }
 
             });
-
-
-            return viewExamQuestionDtos.FirstOrDefault();
         }
 
         private  async Task<List<QuestionSourcewareDto>> GetSourcewares(List<string> questionIds)
@@ -1424,12 +1446,13 @@ namespace Hotline.Application.Exam.Service.ExamManages
             }).ToListAsync();
         }
 
-        private  async Task<List<ViewQuestionOptionDto>> GetQuestionOptions(List<string> questionIds)
+        private  async Task<List<ViewQuestionOptionDto>> GetQuestionOptions(List<string> questionIds,List<string> userExamIds)
         {
+            var selectQuestionOptions = GetQuestionOptionBaks(questionIds, userExamIds,false).MergeTable();
+
             var userExamItemOptionTable = _userExamItemOptionRepository.Queryable();
-            var questionOptionTable = new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
 
-            var querable = questionOptionTable.Where(x => questionIds.Contains(x.ExamQuestionId))
+            var querable = selectQuestionOptions 
                 .LeftJoin(userExamItemOptionTable, (op, uio) => op.Id == uio.QuestionOptionId)
                 .Select((op, uio) => new ViewQuestionOptionDto
                 {
@@ -1439,7 +1462,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                     Label = op.Label,
                     QuestionId = op.ExamQuestionId,
                     IsSelected = uio.Id != null
-                }).MergeTable().OrderBy(x=>x.Label);
+                }).MergeTable().OrderBy(x => x.Label);
 
             return await querable.Distinct()
                 .ToListAsync();
@@ -1470,28 +1493,33 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
         private  async Task<List<ViewExamQuestionDto>> GetViewExamQuestion(string id,string questionId)
         {
-            var userExamTable = _repository.Queryable().Where(x => x.Id == id);
-            var userExamItemTable = _userExamItemRepository.Queryable();
-            var examManageTable = _examManageRepository.Queryable();
-            var questionTable = new ExamRepository<ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().WhereIF(!string.IsNullOrEmpty(questionId), x => x.QuestionId == questionId);
-            var questionScoreTable = new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
+            var expression = ExpressionableUtility.CreateExpression<ExamUserExam>()
+                .And(x => x.Id == id).ToExpression();
 
+            ISugarQueryable<GradingExamQuestionTempDto> queryable = GetViewExamQuestionTempDtos(expression);
 
-            var querable = userExamItemTable.InnerJoin(userExamTable, (ui, u) => ui.UserExamId == u.Id)
-                            .InnerJoin(questionTable, (ui, u, q) => ui.QuestionId == q.QuestionId && u.ExamId == q.ExamId)
-                            .InnerJoin(examManageTable, (ui, u, q, e) => u.ExamId == e.Id)
-                            .InnerJoin(questionScoreTable, (ui, u, q, e, s) => q.QuestionType == s.QuestionType && s.ExamManageId == e.Id)
-                            .Select((ui, u, q, e, s) => new ViewExamQuestionDto
-                            {
-                                Id = ui.Id,
-                                Score = s.Score,
-                                RealScore = ui.Score,
-                                Title = q.Title,
-                                QuestionType = q.QuestionType,
-                                QuestionId = q.Id,
-                            }).MergeTable().OrderBy(x=>x.QuestionType).OrderBy(x=>x.Id);
-
-            return await querable.Distinct().ToListAsync();
+            queryable = queryable.MergeTable().WhereIF(!string.IsNullOrEmpty(questionId), x => x.QuestionId == questionId);
+
+            var queryResult = await queryable.ToListAsync();
+
+            var viewExamQuestion = queryResult.GroupBy(x => new
+            {
+                Id = x.Id,
+                QuestionType = x.QuestionType
+            }).Select(g => new ViewExamQuestionDto
+            {
+                Answer = g.FirstOrDefault().Answer,
+                QuestionType = g.Key.QuestionType,
+                QuestionId= g.FirstOrDefault().QuestionId,
+                ExamQuestionId = g.FirstOrDefault().ExamQuestionId,
+                Id = g.Key.Id,
+                Score = g.FirstOrDefault().QuestionScore,
+                RealScore = g.FirstOrDefault().Score,
+                Title = g.FirstOrDefault().Title,
+                CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Empty : g.FirstOrDefault()?.CorrectAnswer
+            }).ToList();
+
+            return viewExamQuestion;
         }
         #endregion
 

+ 4 - 2
src/Hotline.Application/Exam/Service/Practices/PracticeService.cs

@@ -670,11 +670,13 @@ namespace Hotline.Application.Exam.Service.Practices
             var tagQuestionTable = tagQuestionRepository.Queryable().Where(expression);
             var questionTable = quesitonRepository.Queryable().Where(questionExpression);
 
-            var taqQuestions = await tagQuestionTable.LeftJoin(questionTable, (t, q) => t.QuestionId == q.Id)
+            var queryable = tagQuestionTable.InnerJoin(questionTable, (t, q) => t.QuestionId == q.Id)
                 .Select((t, q) => new TagQuestionCountViewResponse
                 {
                     TotalCount = SqlFunc.AggregateCount(t.Id)
-                })
+                });
+
+            var taqQuestions = await queryable
                 .ToListAsync();
 
             return taqQuestions.Count() > 0 ? taqQuestions.FirstOrDefault() : new TagQuestionCountViewResponse

+ 14 - 0
src/Hotline.Application/OrderApp/IOrderApplication.cs

@@ -245,6 +245,20 @@ namespace Hotline.Application.OrderApp
         /// <returns></returns>
         ISugarQueryable<OrderBiCentreDataListVo> CentreDataList(ReportPagedRequest dto);
 
+        /// <summary>
+        /// 话务员办件统计--自贡专用
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderBiCentreDataListVo> CentreDataListZG(ReportPagedRequest dto);
+
+        /// <summary>
+        /// 话务员办件统计明细--自贡专用
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order> CentreDataListDetailZG(CentreDataListDetailRequest dto);
+
         /// <summary>
         /// 工单业务量统计
         /// </summary>

+ 97 - 5
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -1875,8 +1875,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                                                                                                //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
                 .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
-				.WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgCode), d => d.ActualHandleOrgCode.StartsWith(dto.ActualHandleOrgCode)) //接办部门(综合查询模糊)
-				.WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
+                .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgCode), d => d.ActualHandleOrgCode.StartsWith(dto.ActualHandleOrgCode)) //接办部门(综合查询模糊)
+                .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
                 .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
                 .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
                 .WhereIF(dto.StartTimeStart.HasValue, d => d.StartTime >= dto.StartTimeStart) //流程开启时间开始
@@ -1934,9 +1934,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTags.Any(ot => ot.DicDataValue == dto.OrderTagCode)) //工单标签
                 .WhereIF(!string.IsNullOrEmpty(dto.FocusOnEvents),
                     d => d.FocusOnEvents.Contains(dto.FocusOnEvents) && !d.FocusOnEvents.Contains("99")) //!string.IsNullOrEmpty(d.FocusOnEvents) && SqlFunc.SplitIn(d.FocusOnEvents, dto.FocusOnEvents))
-				 .WhereIF(dto.SeatEvaluate.Any(), d => dto.SeatEvaluate.Contains(d.SeatEvaluate.Value)) //话务员评价(话务评价)
-				.WhereIF(dto.OrgProcessingResults.Any(),d => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(d.OrgProcessingResults, "Key")))//部门办件结果
-				.OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
+                 .WhereIF(dto.SeatEvaluate.Any(), d => dto.SeatEvaluate.Contains(d.SeatEvaluate.Value)) //话务员评价(话务评价)
+                .WhereIF(dto.OrgProcessingResults.Any(), d => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(d.OrgProcessingResults, "Key")))//部门办件结果
+                .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
                 .OrderByIF(dto is { SortField: "no", SortRule: 0 }, d => d.No, OrderByType.Asc) //工单编号升序
                 .OrderByIF(dto is { SortField: "no", SortRule: 1 }, d => d.No, OrderByType.Desc) //工单编号降序
                 .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 0 }, d => d.IsProvince, OrderByType.Asc) //是否省工单升序
@@ -3558,6 +3558,98 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return query;
     }
 
+    /// <summary>
+    /// 话务员办件统计--自贡专用
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderBiCentreDataListVo> CentreDataListZG(ReportPagedRequest dto)
+    {
+        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+
+        var query = _orderRepository.Queryable(false, false, false)
+            .WhereIF(dto.StartTime.HasValue, it => it.CreationTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, it => it.CreationTime <= dto.EndTime)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), it => it.SignerName.Contains(dto.Keyword!))
+            .GroupBy(it => new { it.AcceptorId })
+            .Select(it => new OrderBiCentreDataListVo
+            {
+                UserId = it.AcceptorId,
+                CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.FileOrgIsCenter == true, 1, 0)), //中心归档件
+
+                CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.FileOrgIsCenter == false) ||
+               (it.ActualHandleStepName != "话务部" && it.Status < EOrderStatus.Filed && it.Status > EOrderStatus.WaitForAccept)
+               , 1, 0)),//转办件(部门归档件+已开启流程且当前节点在非话务部的办理中的工单)
+
+                NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.ActualHandleStepName == "话务部" &&
+                it.Status < EOrderStatus.Filed && it.Status > EOrderStatus.WaitForAccept, 1, 0)),//待转办信件(当前节点为话务部,已受理未归档的工单)
+
+                Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status > EOrderStatus.WaitForAccept, 1, 0))//排除待受理工单
+            })
+            .LeftJoin<User>((it, u) => it.UserId == u.Id)
+            .Select((it, u) => new OrderBiCentreDataListVo
+            {
+                UserId = it.UserId,
+                UserName = u.Name,
+                CentreArchive = it.CentreArchive,
+                CentreCareOf = it.CentreCareOf,
+                NoCentreCareOf = it.NoCentreCareOf,
+                Subtotal = it.Subtotal
+            }).MergeTable()
+            ;
+        switch (dto.SortField)
+        {
+            case "centreArchive":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreArchive) : query.OrderByDescending(x => x.CentreArchive);
+                break;
+            case "centreCareOf":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreCareOf) : query.OrderByDescending(x => x.CentreCareOf);
+                break;
+            case "noCentreCareOf":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.NoCentreCareOf) : query.OrderByDescending(x => x.NoCentreCareOf);
+                break;
+            case "subtotal":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
+                break;
+        }
+
+        if (string.IsNullOrEmpty(dto.SortField))
+        {
+            query = query.OrderByDescending(x => x.Subtotal);
+        }
+
+        return query;
+    }
+
+    /// <summary>
+    /// 话务员办件统计明细--自贡专用
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<Order> CentreDataListDetailZG(CentreDataListDetailRequest dto)
+    {
+        var query = _orderRepository.Queryable(false, false, false)
+       .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
+       .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
+       .WhereIF(!string.IsNullOrEmpty(dto.UserId), p => p.AcceptorId == dto.UserId);
+        if (dto.TypeId == "0")//所有信件
+            query = query.Where(p => p.Status > EOrderStatus.WaitForAccept);
+
+        if (dto.TypeId == "1")//中心归档件
+            query = query.Where(p => p.Status >= EOrderStatus.Filed && p.FileOrgIsCenter == true);
+
+        if (dto.TypeId == "2")//转办信件
+            query = query.Where(p => (p.Status >= EOrderStatus.Filed && p.FileOrgIsCenter == false) ||
+               (p.ActualHandleStepName != "话务部" && p.Status < EOrderStatus.Filed && p.Status > EOrderStatus.WaitForAccept));
+
+        if (dto.TypeId == "3")//待转办信件
+            query = query.Where(p => p.ActualHandleStepName == "话务部" && p.Status < EOrderStatus.Filed && p.Status > EOrderStatus.WaitForAccept);
+
+        query = query.OrderByDescending(p => p.CreationTime);
+
+        return query;
+    }
+
     /// <summary>
     /// 工单业务量统计
     /// </summary>

+ 6 - 0
src/Hotline.Share/Dtos/ExamManages/ExamQuestionDto.cs

@@ -61,6 +61,12 @@ namespace Hotline.Share.Dtos.ExamManages
         [Description("试题Id")]
         public string QuestionId { get; set; }
 
+        /// <summary>
+        /// 考试试题Id
+        /// </summary>
+        [Description("考试试题Id")]
+        public string ExamQuestionId { get; set; }
+
         /// <summary>
         /// 试题关联知识
         /// </summary>

+ 12 - 0
src/Hotline.Share/Dtos/ExamManages/GradingExamQuestionDto.cs

@@ -109,6 +109,18 @@ namespace Exam.Application.Interface.Exam
         /// </summary>
         [Description("实际分数")]
         public int? Score { get; set; }
+
+        /// <summary>
+        /// 试题Id
+        /// </summary>
+        [Description("试题Id")]
+        public string QuestionId { get; set; }
+
+        /// <summary>
+        /// 考试试题Id
+        /// </summary>
+        [Description("考试试题Id")]
+        public string ExamQuestionId { get; set; }
     }
 
     public class UserExamQuestionDto : IActionRequest

+ 3 - 0
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -74,6 +74,9 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int Repeat { get; set; }
 
+        /// <summary>
+        /// 所有信件
+        /// </summary>
         //public int Subtotal => CentreArchive + CentreCareOf + NoCentreCareOf + Invalid + Repeat;
         public int Subtotal { get; set; }
     }

+ 10 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -184,6 +184,16 @@ public class PublishOrderPageBaseDto
     /// 随手拍工单标签
     /// </summary>
     public IReadOnlyCollection<SystemDicDataOutDto> SnapshotLabel { get; set; }
+
+    /// <summary>
+    /// 诉求人意愿是否公开(省政府网站、省政务服务网、天府通办App)
+    /// </summary>
+    public bool? IsPublic { get; set; }
+
+    /// <summary>
+    /// 省工单是否可以选择意愿是否公开
+    /// </summary>
+    public bool IsProvincePublic { get; set; } = false;
 }
 
 public class PublishPublishOrderDto

+ 13 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -1769,4 +1769,17 @@ public record AreaSubordinateRequest
     /// 线路号
     /// </summary>
     public string? Line { get; set; }
+}
+
+public record CentreDataListDetailRequest : PagedKeywordRequest
+{
+    /// <summary>
+    /// 用户id
+    /// </summary>
+    public string? UserId { get; set; }
+
+    /// <summary>
+    /// 明细类型 0:所有信件, 1:中心归档件,2:转办信件,3:待转办信件
+    /// </summary>
+    public string? TypeId { get; set; }
 }

+ 2 - 2
src/Hotline/Orders/Order.cs

@@ -916,9 +916,9 @@ namespace Hotline.Orders
         public bool? ProvinceSendBack { get; set; }
 
         /// <summary>
-        /// 是否公开(省政府网站、省政务服务网、天府通办App)
+        /// 诉求人意愿是否公开(省政府网站、省政务服务网、天府通办App)
         /// </summary>
-        [SugarColumn(ColumnDescription ="省是否公开")]
+        [SugarColumn(ColumnDescription = "诉求人意愿是否公开")]
         public bool? IsPublic { get; set; }
 
         #endregion