xf 1 éve
szülő
commit
9ca01ff7cc

+ 4 - 14
src/Hotline.Api/Controllers/OrderController.cs

@@ -267,7 +267,7 @@ public class OrderController : BaseController
     {
         var order = await _orderRepository.Queryable()
             .Includes(d => d.Acceptor)
-            .Includes(d => d.OrderComplain)
+            .Includes(d => d.OrderExtension)
             .FirstAsync(d => d.Id == id);
 
         if (order is null)
@@ -1449,8 +1449,7 @@ public class OrderController : BaseController
     {
         var order = await _orderRepository.Queryable()
             .Includes(d => d.Acceptor)
-            .Includes(d => d.OrderComplain)
-            .Includes(d => d.OrderReport)
+            .Includes(d => d.OrderExtension)
             .Includes(d => d.OrderDelays)
             .Includes(d => d.OrderScreens)
             .Includes(d => d.OrderVisits, x => x.OrderVisitDetails)
@@ -1495,6 +1494,7 @@ public class OrderController : BaseController
     [HttpPost]
     public async Task<string> Add([FromBody] AddOrderDto dto)
     {
+        //todo dto validation
         var order = _mapper.Map<Order>(dto);
         var orderId = await _orderDomainService.AddAsync(order, HttpContext.RequestAborted);
         if (dto.Tags.Any()) await _repositoryts.AddVectorAsync(orderId, DateTime.Now, dto.Tags, HttpContext.RequestAborted);
@@ -1547,18 +1547,12 @@ public class OrderController : BaseController
     public async Task Update([FromBody] UpdateOrderDto dto)
     {
         var order = await _orderRepository.Queryable()
-            .Includes(d => d.OrderComplain)
-            .Includes(d => d.OrderReport)
             .FirstAsync(d => d.Id == dto.Id);
         if (order == null)
             throw UserFriendlyException.SameMessage("无效工单编号");
         if (order.Status != EOrderStatus.WaitForAccept || !string.IsNullOrEmpty(order.WorkflowId))
             throw UserFriendlyException.SameMessage("工单已发起流程");
 
-        if (order?.OrderComplain is not null)
-            await _orderRepository.RemoveOrderComplainAsync(order.OrderComplain, HttpContext.RequestAborted);
-        if (order?.OrderReport is not null)
-            await _orderRepository.RemoveOrderReportAsync(order.OrderReport, HttpContext.RequestAborted);
         if (dto.Tags.Any()) await _repositoryts.UpdateVectorAsync(dto.Id, dto.Tags, HttpContext.RequestAborted);
         if (dto.RepeatableEventDetails?.Any() ?? false)
         {
@@ -1573,7 +1567,7 @@ public class OrderController : BaseController
             }
         }
         _mapper.Map(dto, order);
-        await _orderRepository.UpdateOrderNavAsync(order, HttpContext.RequestAborted);
+        await _orderRepository.UpdateNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
     }
 
     /// <summary>
@@ -1628,10 +1622,6 @@ public class OrderController : BaseController
     /// <summary>
     /// 查询工单办理的期满时间配置
     /// </summary>
-    /// <param name="flowDirection"></param>
-    /// <param name="acceptType"></param>
-    /// <returns></returns>
-    /// <exception cref="ArgumentOutOfRangeException"></exception>
     [HttpGet("time-config")]
     public async Task<TimeConfig> GetOrderHandleTimeConfig(EFlowDirection flowDirection, string? acceptType)
     {

+ 14 - 17
src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs

@@ -88,27 +88,26 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
                 var expiredTimeChanged = false;
                 if (data.FlowDirection.HasValue && data.External.TimeLimit.HasValue && data.External.TimeLimitUnit.HasValue)
                 {
-                    //todo 1. calc expiredTime 2. update order.expiredTime 3. update workflow.expiredTime 4. publish province
-                    //todo 1. calc expiredTime with 1 day 2. update order.expiredTime 3. update workflow.expiredTime 4. publish province
-                    //TimeResult expiredTime;
-                    //if (data.FlowDirection is EFlowDirection.CenterToOrg)
-                    //{
-                    //    expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode, false);
-                    //    order.CenterToOrg(expiredTime.EndTime);
-                    //}
-                    //else
-                    //{
-                    //    expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.Day, 1, true);
-                    //    order.OrgToCenter(expiredTime.EndTime);
-                    //}
+                    // 1. calc expiredTime 2. update order.expiredTime 3. update workflow.expiredTime 4. publish province
+                    
                     var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, data.External.TimeLimitUnit.Value,
                         data.External.TimeLimit.Value, data.FlowDirection is EFlowDirection.OrgToCenter);
 
+                    if (data.FlowDirection is EFlowDirection.OrgToCenter)
+                    {
+                        order.OrgToCenter(expiredTime.EndTime);
+                    }
+                    else if (data.FlowDirection is EFlowDirection.CenterToOrg)
+                    {
+                        order.CenterToOrg(expiredTime.EndTime);
+                    }
+
                     await _workflowDomainService.UpdateExpiredTimeAsync(workflow, expiredTime.EndTime,
                         expiredTime.RuleStr, data.External.TimeLimit, data.External.TimeLimitUnit, cancellationToken);
-                    
+
                     expiredTimeChanged = true;
                 }
+                await _orderRepository.UpdateAsync(order, cancellationToken);
 
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowHandled, new OrderFlowDto
@@ -118,9 +117,7 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
                     ExpiredTimeChanged = expiredTimeChanged,
                     HandlerOrgLevel = notification.HandlerOrgCode.CalcOrgLevel()
                 }, cancellationToken: cancellationToken);
-
-
-                await _orderRepository.UpdateAsync(order, cancellationToken);
+                
                 break;
             case WorkflowModuleConsts.KnowledgeAdd:
             case WorkflowModuleConsts.KnowledgeUpdate:

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/PreviousStepHandler.cs

@@ -71,7 +71,7 @@ namespace Hotline.Application.Handlers.FlowEngine
                             expiredTime.RuleStr, null, null, cancellationToken);
 
                         var dto = _mapper.Map<OrderDto>(order);
-                        await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowPrevious, dto, cancellationToken: cancellationToken);
+                        await _capPublisher.PublishAsync(EventNames.HotlineOrderExpiredTimeUpdate, dto, cancellationToken: cancellationToken);
                     }
 
                     break;

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/RecallStepHandler.cs

@@ -65,7 +65,7 @@ public class RecallStepHandler : INotificationHandler<RecallNotify>
                         expiredTime.RuleStr, data.External.TimeLimit, data.External.TimeLimitUnit, cancellationToken);
 
                     var dto = _mapper.Map<OrderDto>(order);
-                    await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowRecalled, dto, cancellationToken: cancellationToken);
+                    await _capPublisher.PublishAsync(EventNames.HotlineOrderExpiredTimeUpdate, dto, cancellationToken: cancellationToken);
                 }
 
                 break;

+ 3 - 6
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -10,21 +10,18 @@ public class OrderMapperConfigs : IRegister
     public void Register(TypeAdapterConfig config)
     {
         config.ForType<Order, OrderDto>()
-            .IgnoreIf((s, d) => s.OrderComplain == null, d => d.OrderComplain)
-            .IgnoreIf((s, d) => s.OrderReport == null, d => d.OrderReport)
+            .IgnoreIf((s, d) => s.OrderExtension == null, d => d.OrderExtension)
             .IgnoreIf((s, d) => s.Hotspot == null, d => d.Hotspot)
             ;
 
         config.ForType<AddOrderDto, Order>()
-            .IgnoreIf((s, d) => s.OrderComplain == null, d => d.OrderComplain)
-            .IgnoreIf((s, d) => s.OrderReport == null, d => d.OrderReport)
+            .IgnoreIf((s, d) => s.OrderExtension == null, d => d.OrderExtension)
             .Map(d => d.Additions, s => s.Files)
             ;
 
         config.ForType<UpdateOrderDto, Order>()
             .Inherits<AddOrderDto, Order>()
-            .Map(d => d.OrderComplain.Id, x => x.Id)
-            .Map(d => d.OrderReport.Id, x => x.Id);
+            .Map(d => d.OrderExtension.Id, x => x.Id);
 
         config.ForType<Workflow, Order>()
             .Map(d => d.WorkflowId, s => s.Id)

+ 8 - 1
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -3,13 +3,20 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Orders;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Settings;
 using XF.Domain.Entities;
 
 namespace Hotline.Application.Orders
 {
     public interface IOrderApplication
     {
-       
+        /// <summary>
+        /// 更新工单办理期满时间
+        /// 1.更新工单 2.更新流程 3.推送省平台
+        /// </summary>
+        /// <returns></returns>
+        Task UpdateOrderHandleExpiredTimeAsync(Order order, ETimeType timeType, int timeCount, bool publishToProvince = true);
     }
 }

+ 11 - 0
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1,6 +1,7 @@
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Settings;
 using Hotline.Users;
 using XF.Domain.Dependency;
 using XF.Domain.Entities;
@@ -21,4 +22,14 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _workflowDomainService = workflowDomainService;
         _orderRepository = orderRepository;
     }
+
+    /// <summary>
+    /// 更新工单办理期满时间
+    /// 1.更新工单 2.更新流程 3.推送省平台
+    /// </summary>
+    /// <returns></returns>
+    public async Task UpdateOrderHandleExpiredTimeAsync(Order order, ETimeType timeType, int timeCount, bool publishToProvince = true)
+    {
+        throw new NotImplementedException();
+    }
 }

+ 46 - 39
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -36,51 +36,58 @@ namespace Hotline.Repository.SqlSugar.Orders
 
         public async Task<string> AddOrderNavAsync(Order order, CancellationToken cancellationToken)
         {
-            if (order.OrderType == EOrderType.MarketSupervisionBy12315)
-            {
-                //弥补AddNav方法没有自动指派到创建人
-                order.AssignToCreator(_dataPermissionFilterBuilder.DataPermissionManager);
+            //弥补AddNav方法没有自动指派到创建人
+            order.AssignToCreator(_dataPermissionFilterBuilder.DataPermissionManager);
 
-                if (order.AcceptTypeCode == AcceptTypeConst.TouSu)
-                {
-                    order.OrderComplain.InitDatePermission(_dataPermissionFilterBuilder.DataPermissionManager);
-                    await AddNav(order).Include(d => d.OrderComplain).ExecuteCommandAsync();
-                }
-                else if (order.AcceptTypeCode == AcceptTypeConst.JuBao)
-                {
-                    order.OrderReport.InitDatePermission(_dataPermissionFilterBuilder.DataPermissionManager);
-                    await AddNav(order).Include(d => d.OrderReport).ExecuteCommandAsync();
-                }
-                else
-                {
-                    throw UserFriendlyException.SameMessage("12315工单不支持该受理类型");
-                }
-            }
-            else
-            {
-                await AddAsync(order, cancellationToken);
-            }
+            await AddNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
+
+            //if (order.OrderType == EOrderType.MarketSupervisionBy12315)
+            //{
+            //    //弥补AddNav方法没有自动指派到创建人
+            //    order.AssignToCreator(_dataPermissionFilterBuilder.DataPermissionManager);
+
+            //    if (order.AcceptTypeCode == AcceptTypeConst.TouSu)
+            //    {
+            //        order.OrderComplain.InitDatePermission(_dataPermissionFilterBuilder.DataPermissionManager);
+            //        await AddNav(order).Include(d => d.OrderComplain).ExecuteCommandAsync();
+            //    }
+            //    else if (order.AcceptTypeCode == AcceptTypeConst.JuBao)
+            //    {
+            //        order.OrderReport.InitDatePermission(_dataPermissionFilterBuilder.DataPermissionManager);
+            //        await AddNav(order).Include(d => d.OrderReport).ExecuteCommandAsync();
+            //    }
+            //    else
+            //    {
+            //        throw UserFriendlyException.SameMessage("12315工单不支持该受理类型");
+            //    }
+            //}
+            //else
+            //{
+            //    await AddAsync(order, cancellationToken);
+            //}
             return order.Id;
         }
 
         public async Task UpdateOrderNavAsync(Order order, CancellationToken cancellationToken)
         {
-            await UpdateAsync(order, cancellationToken);
-            if (order.OrderType == EOrderType.MarketSupervisionBy12315)
-            {
-                if (order.AcceptTypeCode == AcceptTypeConst.TouSu)
-                {
-                    await Db.Insertable<OrderComplain>(order.OrderComplain).ExecuteCommandAsync();
-                }
-                else if (order.AcceptTypeCode == AcceptTypeConst.JuBao)
-                {
-                    await Db.Insertable<OrderReport>(order.OrderReport).ExecuteCommandAsync();
-                }
-                else
-                {
-                    throw UserFriendlyException.SameMessage("12315工单不支持该受理类型");
-                }
-            }
+            //await UpdateAsync(order, cancellationToken);
+            //if (order.OrderType == EOrderType.MarketSupervisionBy12315)
+            //{
+            //    if (order.AcceptTypeCode == AcceptTypeConst.TouSu)
+            //    {
+            //        await Db.Insertable<OrderComplain>(order.OrderComplain).ExecuteCommandAsync();
+            //    }
+            //    else if (order.AcceptTypeCode == AcceptTypeConst.JuBao)
+            //    {
+            //        await Db.Insertable<OrderReport>(order.OrderReport).ExecuteCommandAsync();
+            //    }
+            //    else
+            //    {
+            //        throw UserFriendlyException.SameMessage("12315工单不支持该受理类型");
+            //    }
+            //}
+
+            await UpdateNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
         }
 
         public async Task RemoveOrderComplainAsync(OrderComplain orderComplain, CancellationToken cancellationToken)

+ 1 - 220
src/Hotline.Share/Dtos/Order/OrderComplainDto.cs

@@ -36,223 +36,4 @@ public class OrderComplainDto : OrderExtensionDto
     public List<Kv> ComplainTypes { get; set; } = new();
 
     #endregion
-}
-
-public class OrderExtensionDto
-{
-    public string Id { get; set; }
-
-    #region 投诉人信息
-
-    /// <summary>
-    /// 证件类型
-    /// </summary>
-    public string? LicenceTypeCode { get; set; }
-
-    public string? LicenceType { get; set; }
-
-    /// <summary>
-    /// 证件号码, 证件类型已选的情况为必填,否则非必填
-    /// </summary>
-    public string? LicenceNo { get; set; }
-
-    /// <summary>
-    /// 提供方身份类型
-    /// </summary>
-    public string? IdentityTypeCode { get; set; }
-
-    public string? IdentityType { get; set; }
-
-    /// <summary>
-    /// 提供方身份(投诉人身份)
-    /// </summary>
-    public string? IdentityCode { get; set; }
-
-    public string? Identity { get; set; }
-
-    /// <summary>
-    /// 国籍或地区
-    /// </summary>
-    public string? NationalityCode { get; set; }
-
-    public string? Nationality { get; set; }
-
-    /// <summary>
-    /// 民族
-    /// </summary>
-    public string? NationCode { get; set; }
-
-    public string? Nation { get; set; }
-
-    /// <summary>
-    /// 邮政编码
-    /// </summary>
-    public string? PostalCode { get; set; }
-
-    /// <summary>
-    /// 邮箱
-    /// </summary>
-    public string? Email { get; set; }
-
-    /// <summary>
-    /// 其他联系方式
-    /// </summary>
-    public string? OtherContact { get; set; }
-
-    #endregion
-
-    #region 投诉对象信息
-
-    /// <summary>
-    /// 企业名称
-    /// </summary>
-    public string EnterpriseName { get; set; }
-
-    /// <summary>
-    /// 统一社会信用代码
-    /// </summary>
-    public string? UnifiedSocialCreditCode { get; set; }
-
-    /// <summary>
-    /// 注册地址
-    /// </summary>
-    public string RegisterAddress { get; set; }
-
-    /// <summary>
-    /// 注册号
-    /// </summary>
-    public string? RegisterNumber { get; set; }
-
-    /// <summary>
-    /// 企业联系人
-    /// </summary>
-    public string? EnterpriseContact { get; set; }
-
-    /// <summary>
-    /// 市场主体类型
-    /// </summary>
-    public string? MarketTypeCode { get; set; }
-
-    public string? MarketType { get; set; }
-
-    /// <summary>
-    /// 行业分类
-    /// </summary>
-    public string? IndustryClassifyCode { get; set; }
-
-    public string? IndustryClassify { get; set; }
-
-    #endregion
-
-    #region 投诉/举报 详情
-
-
-    /// <summary>
-    /// 商品分类/品牌
-    /// </summary>
-    public string BrandCode { get; set; }
-
-    public string Brand { get; set; }
-
-    /// <summary>
-    /// 消费金额,只能填写数字,且只能填写非负数
-    /// </summary>
-    public decimal Amount { get; set; }
-
-    /// <summary>
-    /// 客体类别
-    /// </summary>
-    public string ObjectClassifyCode { get; set; }
-
-    public string ObjectClassify { get; set; }
-
-    /// <summary>
-    /// 销售方式
-    /// </summary>
-    public string SalesModeCode { get; set; }
-    public string SalesMode { get; set; }
-
-    /// <summary>
-    /// 电商平台,销售方式为“网购”时展示该字段且必填
-    /// </summary>
-    public string? ECommercePlatformCode { get; set; }
-
-    public string? ECommercePlatform { get; set; }
-
-    /// <summary>
-    /// 外部订单号,销售方式为“ 网购”时展示该字段且必填
-    /// </summary>
-    public string? ExternalOrderNo { get; set; }
-
-    /// <summary>
-    /// 销售渠道
-    /// <remarks>
-    /// 销售方式为“电视购物”“电话购物”“邮购”时展示该字段,且必填 1.电视购物 2.电话购物 3.邮购
-    /// </remarks>
-    /// </summary>
-    public string? SalesChannel { get; set; }
-    public string? SalesChannelCode { get; set; }
-
-    /// <summary>
-    /// 专利权人,“投诉问题类别”为“专利”时展示该字段,选填
-    /// </summary>
-    public string? Patentee { get; set; }
-
-    /// <summary>
-    /// 专利名称,“投诉问题类别”为“专利”时展示该字段,选填
-    /// </summary>
-    public string? PatentName { get; set; }
-
-    /// <summary>
-    /// 专利类型,“投诉问题类别”为“专利”时展示该字段,选填
-    /// </summary>
-    public string? PatentTypeCode { get; set; }
-    public string? PatentType { get; set; }
-
-    /// <summary>
-    /// 专利号,“投诉问题类别”为“专利”时展示该字段,选填
-    /// </summary>
-    public string? PatentNo { get; set; }
-
-    /// <summary>
-    /// 产品名称
-    /// </summary>
-    public string? ProductName { get; set; }
-
-    /// <summary>
-    /// 批准文号
-    /// </summary>
-    public string? ApprovalNumber { get; set; }
-
-    /// <summary>
-    /// 产品批号
-    /// </summary>
-    public string? ProductBatchNo { get; set; }
-
-    /// <summary>
-    /// 产品规格
-    /// </summary>
-    public string? ProductStandard { get; set; }
-
-    /// <summary>
-    /// 产品有效期
-    /// </summary>
-    public DateTime ProductExpiredTime { get; set; }
-
-    /// <summary>
-    /// 生产厂家
-    /// </summary>
-    public string? Manufacturer { get; set; }
-
-    /// <summary>
-    /// 销售企业
-    /// </summary>
-    public string? SalesEnterprise { get; set; }
-
-    /// <summary>
-    /// 消费者地址
-    /// </summary>
-    public string? ConsumerAddress { get; set; }
-
-    #endregion
-}
+}

+ 2 - 7
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -515,14 +515,9 @@ namespace Hotline.Share.Dtos.Order
         public ESource Source { get; set; } = ESource.Hotline;
 
         /// <summary>
-        /// 投诉
+        /// 扩展信息
         /// </summary>
-        public OrderComplainDto OrderComplain { get; set; }
-
-        /// <summary>
-        /// 举报
-        /// </summary>
-        public OrderReportDto OrderReport { get; set; }
+        public OrderExtensionDto? OrderExtension { get; set; }
 
         /// <summary>
         /// 附件列表

+ 543 - 0
src/Hotline.Share/Dtos/Order/OrderExtensionDto.cs

@@ -0,0 +1,543 @@
+namespace Hotline.Share.Dtos.Order;
+
+public class OrderExtensionDto
+{
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 创建时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 工单类型
+    /// </summary>
+    public string OrderType { get; set; }
+    public string OrderTypeCode { get; set; }
+
+    #region 投诉人信息
+
+    /// <summary>
+    /// 证件类型
+    /// </summary>
+    public string? LicenceTypeCode { get; set; }
+
+    public string? LicenceType { get; set; }
+
+    /// <summary>
+    /// 证件号码, 证件类型已选的情况为必填,否则非必填
+    /// </summary>
+    public string? LicenceNo { get; set; }
+
+    /// <summary>
+    /// 提供方身份类型
+    /// </summary>
+    public string? IdentityTypeCode { get; set; }
+
+    public string? IdentityType { get; set; }
+
+    /// <summary>
+    /// 提供方身份(投诉人身份)
+    /// </summary>
+    public string? IdentityCode { get; set; }
+
+    public string? Identity { get; set; }
+
+    /// <summary>
+    /// 国籍或地区
+    /// </summary>
+    public string? NationalityCode { get; set; }
+
+    public string? Nationality { get; set; }
+
+    /// <summary>
+    /// 民族
+    /// </summary>
+    public string? NationCode { get; set; }
+
+    public string? Nation { get; set; }
+
+    /// <summary>
+    /// 邮政编码
+    /// </summary>
+    public string? PostalCode { get; set; }
+
+    /// <summary>
+    /// 邮箱
+    /// </summary>
+    public string? Email { get; set; }
+
+    /// <summary>
+    /// 其他联系方式
+    /// </summary>
+    public string? OtherContact { get; set; }
+
+    #endregion
+
+    #region 投诉对象信息
+
+    /// <summary>
+    /// 企业名称
+    /// </summary>
+    public string EnterpriseName { get; set; }
+
+    /// <summary>
+    /// 统一社会信用代码
+    /// </summary>
+    public string? UnifiedSocialCreditCode { get; set; }
+
+    /// <summary>
+    /// 注册地址
+    /// </summary>
+    public string RegisterAddress { get; set; }
+
+    /// <summary>
+    /// 注册号
+    /// </summary>
+    public string? RegisterNumber { get; set; }
+
+    /// <summary>
+    /// 企业联系人
+    /// </summary>
+    public string? EnterpriseContact { get; set; }
+
+    /// <summary>
+    /// 市场主体类型
+    /// </summary>
+    public string? MarketTypeCode { get; set; }
+
+    public string? MarketType { get; set; }
+
+    /// <summary>
+    /// 行业分类
+    /// </summary>
+    public string? IndustryClassifyCode { get; set; }
+    public string? IndustryClassify { get; set; }
+
+    #endregion
+
+    #region 投诉/举报 详情
+
+
+    /// <summary>
+    /// 商品分类/品牌
+    /// </summary>
+    public string BrandCode { get; set; }
+
+    public string Brand { get; set; }
+
+    /// <summary>
+    /// 消费金额,只能填写数字,且只能填写非负数
+    /// </summary>
+    public decimal Amount { get; set; }
+
+    /// <summary>
+    /// 客体类别
+    /// </summary>
+    public string ObjectClassifyCode { get; set; }
+
+    public string ObjectClassify { get; set; }
+
+    /// <summary>
+    /// 销售方式
+    /// </summary>
+    public string SalesModeCode { get; set; }
+    public string SalesMode { get; set; }
+
+    /// <summary>
+    /// 电商平台,销售方式为“网购”时展示该字段且必填
+    /// </summary>
+    public string? ECommercePlatformCode { get; set; }
+
+    public string? ECommercePlatform { get; set; }
+
+    /// <summary>
+    /// 外部订单号,销售方式为“ 网购”时展示该字段且必填
+    /// </summary>
+    public string? ExternalOrderNo { get; set; }
+
+    /// <summary>
+    /// 销售渠道
+    /// <remarks>
+    /// 销售方式为“电视购物”“电话购物”“邮购”时展示该字段,且必填 1.电视购物 2.电话购物 3.邮购
+    /// </remarks>
+    /// </summary>
+    public string? SalesChannel { get; set; }
+    public string? SalesChannelCode { get; set; }
+
+    /// <summary>
+    /// 专利权人,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? Patentee { get; set; }
+
+    /// <summary>
+    /// 专利名称,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? PatentName { get; set; }
+
+    /// <summary>
+    /// 专利类型,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? PatentTypeCode { get; set; }
+
+    public string? PatentType { get; set; }
+
+    /// <summary>
+    /// 专利号,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? PatentNo { get; set; }
+
+    /// <summary>
+    /// 产品名称
+    /// </summary>
+    public string? ProductName { get; set; }
+
+    /// <summary>
+    /// 批准文号
+    /// </summary>
+    public string? ApprovalNumber { get; set; }
+
+    /// <summary>
+    /// 产品批号
+    /// </summary>
+    public string? ProductBatchNo { get; set; }
+
+    /// <summary>
+    /// 产品规格
+    /// </summary>
+    public string? ProductStandard { get; set; }
+
+    /// <summary>
+    /// 产品有效期
+    /// </summary>
+    public DateTime? ProductExpiredTime { get; set; }
+
+    /// <summary>
+    /// 生产厂家
+    /// </summary>
+    public string? Manufacturer { get; set; }
+
+    /// <summary>
+    /// 销售企业
+    /// </summary>
+    public string? SalesEnterprise { get; set; }
+
+    /// <summary>
+    /// 消费者地址
+    /// </summary>
+    public string? ConsumerAddress { get; set; }
+
+    #endregion
+
+    #region 投诉详情
+
+    /// <summary>
+    /// 投诉问题类别
+    /// </summary>
+    public string ComplainClassifyCode { get; set; }
+
+    public string ComplainClassify { get; set; }
+
+    /// <summary>
+    /// 争议发生时间
+    /// </summary>
+    public DateTime OccurrenceTime { get; set; }
+
+    /// <summary>
+    /// 投诉目标,销售方式为“网购”时展示该字段且必填
+    /// </summary>
+    public string? ComplainTargetCode { get; set; }
+
+    public string? ComplainTarget { get; set; }
+
+    /// <summary>
+    /// 经营地址,销售方式为“现场”时必填
+    /// </summary>
+    public Position? BusinessPosition { get; set; }
+
+    /// <summary>
+    /// 诉求内容,多选
+    /// </summary>
+    public List<Kv> ComplainTypes { get; set; }
+
+    #endregion
+
+    #region 举报详情
+
+    /// <summary>
+    /// 举报问题类别
+    /// </summary>
+    public string ReportClassifyCode { get; set; }
+
+    public string ReportClassify { get; set; }
+
+    /// <summary>
+    /// 举报目标,销售方式为“网购”时展示该字段且必填
+    /// </summary>
+    public string? ReportTargetCode { get; set; }
+
+    public string? ReportTarget { get; set; }
+
+    #endregion
+
+    #region 医疗服务中心受理单
+
+    /// <summary>
+    /// 投诉医院名称
+    /// </summary>
+    public string? MedName { get; set; }
+
+    /// <summary>
+    /// 投诉医院地址
+    /// </summary>
+    public string? MedAddress { get; set; }
+
+    /// <summary>
+    /// 投诉医院科室
+    /// </summary>
+    public string? MedDepartment { get; set; }
+
+    /// <summary>
+    /// 投诉医院医生
+    /// </summary>
+    public string? MedDoctor { get; set; }
+
+    /// <summary>
+    /// 患者
+    /// </summary>
+    public string? MedPatient { get; set; }
+
+    /// <summary>
+    /// 就诊卡号
+    /// </summary>
+    public string? MedNo { get; set; }
+
+    /// <summary>
+    /// 身份证号
+    /// </summary>
+    public string? MedIdNo { get; set; }
+
+    #endregion
+
+    #region 电视购物及商铺购买退换货中心受理单
+
+    /// <summary>
+    /// 电视台(商铺)
+    /// </summary>
+    public string? ExchTv { get; set; }
+
+    /// <summary>
+    /// 购买时间
+    /// </summary>
+    public DateTime? ExchTradeTime { get; set; }
+
+    /// <summary>
+    /// 产品名称
+    /// </summary>
+    public string? ExchProduct { get; set; }
+
+    /// <summary>
+    /// 消费金额
+    /// </summary>
+    public double? ExchAmount { get; set; }
+
+    /// <summary>
+    /// 商家名称
+    /// </summary>
+    public string? ExchName { get; set; }
+
+    /// <summary>
+    /// 商家地址
+    /// </summary>
+    public string? ExchAddress { get; set; }
+
+    /// <summary>
+    /// 收货人
+    /// </summary>
+    public string? ExchConsignee { get; set; }
+
+    /// <summary>
+    /// 收货人地址
+    /// </summary>
+    public string? ExchConsigneeAddress { get; set; }
+
+    #endregion
+
+    #region 电视台虚假广告中心受理单
+
+    /// <summary>
+    /// 虚假广告电视台名称
+    /// </summary>
+    public string? AdTv { get; set; }
+
+    /// <summary>
+    /// 虚假广告产品名称
+    /// </summary>
+    public string? AdProduct { get; set; }
+
+    /// <summary>
+    /// 虚假广告具体内容
+    /// </summary>
+    public string? AdContent { get; set; }
+    #endregion
+
+    #region 高速公路投诉中心受理单
+
+    /// <summary>
+    /// 高速入口
+    /// </summary>
+    public string? ExpwyEntrance { get; set; }
+
+    /// <summary>
+    /// 高速出口
+    /// </summary>
+    public string? ExpwyExit { get; set; }
+
+    /// <summary>
+    /// 发生时间
+    /// </summary>
+    public DateTime? ExpwyTime { get; set; }
+
+    /// <summary>
+    /// 车牌号
+    /// </summary>
+    public string? ExpwyNo { get; set; }
+    #endregion
+
+    #region 四川政务服务网技术中心受理单
+
+    /// <summary>
+    /// 四川政务服务网账号
+    /// </summary>
+    public string? ZwfwwAccount { get; set; }
+
+    /// <summary>
+    /// 四川政务服务网联系方式
+    /// </summary>
+    public string? ZwfwwContact { get; set; }
+    #endregion
+
+    #region 四川省12366热线诉求交办单
+
+    /// <summary>
+    /// 主管税务机关(问题归属地)
+    /// </summary>
+    public string? Location12366Ts { get; set; }
+
+    /// <summary>
+    /// 被投诉单位或个人信息
+    /// </summary>
+    public string? Info12366Ts { get; set; }
+
+    /// <summary>
+    /// 12366的投诉类型
+    /// </summary>
+    public string? Type12366Ts { get; set; }
+    #endregion
+
+    #region 四川省12366热线咨询交办单
+
+    /// <summary>
+    /// 主管税务机关(问题归属地)
+    /// </summary>
+    public string? Location12366Zx { get; set; }
+
+    /// <summary>
+    /// 被投诉单位或个人信息
+    /// </summary>
+    public string? Info12366Zx { get; set; }
+    #endregion
+
+    #region 12328服务监督中心受理单
+
+    /// <summary>
+    /// 受理方式
+    /// </summary>
+    public string? AcceptType12328 { get; set; }
+
+    /// <summary>
+    /// 客户
+    /// </summary>
+    public string? Client12328 { get; set; }
+    #endregion
+
+    #region 邮政业消费者申诉受理单
+
+    /// <summary>
+    /// 申诉人姓名
+    /// </summary>
+    public string? MailClaimantName { get; set; }
+
+    /// <summary>
+    /// 申诉人电话
+    /// </summary>
+    public string? MailClaimantPhone { get; set; }
+
+    /// <summary>
+    /// 申诉人企业
+    /// </summary>
+    public string? MailClaimantEnterprise { get; set; }
+
+    /// <summary>
+    /// 寄件人姓名
+    /// </summary>
+    public string? MailSenderName { get; set; }
+    public string? MailSenderPhone { get; set; }
+    public string? MailSenderAddress { get; set; }
+
+    /// <summary>
+    /// 收件人姓名
+    /// </summary>
+    public string? MailReceiverName { get; set; }
+    public string? MailReceiverPhone { get; set; }
+    public string? MailReceiverAddress { get; set; }
+
+    /// <summary>
+    /// 涉及金额
+    /// </summary>
+    public string? MailAmount { get; set; }
+
+    /// <summary>
+    /// 是否联系快递公司投诉
+    /// </summary>
+    public bool? MailIsContacted { get; set; }
+
+    /// <summary>
+    /// 处理结果
+    /// </summary>
+    public string? MailResult { get; set; }
+    #endregion
+
+    #region 环保举报业务受理单
+
+    /// <summary>
+    /// 举报人邮箱
+    /// </summary>
+    public string? EpEmail { get; set; }
+
+    /// <summary>
+    /// 举报人通讯地址
+    /// </summary>
+    public string? EpAddress { get; set; }
+
+    /// <summary>
+    /// 举报对象
+    /// </summary>
+    public string? EpObject { get; set; }
+
+    /// <summary>
+    /// 被举报对象地址
+    /// </summary>
+    public string? EpObjectAddress { get; set; }
+
+    /// <summary>
+    /// 对应行业类型
+    /// </summary>
+    public string? EpIndustryType { get; set; }
+
+    /// <summary>
+    /// 重点要素
+    /// </summary>
+    public string? EpKeyPoint { get; set; }
+    #endregion
+}

+ 4 - 9
src/Hotline.Share/Mq/EventNames.Order.cs

@@ -28,15 +28,10 @@ namespace Hotline.Share.Mq
         /// </summary>
         public const string HotlineOrderFlowPrevious = "hotline.order.flow.previous";
 
-        ///// <summary>
-        ///// 热线工单期满时间变更
-        ///// </summary>
-        //public const string HotlineOrderExpiredTimeUpdate = "hotline.order.expiredtime.update";
-
-        ///// <summary>
-        ///// 热线工单一级部门办理完
-        ///// </summary>
-        //public const string HotlineOrderLevelOneOrgHandled = "hotline.order.leveloneorg.handled";
+        /// <summary>
+        /// 热线工单期满时间变更
+        /// </summary>
+        public const string HotlineOrderExpiredTimeUpdate = "hotline.order.expiredtime.update";
 
         /// <summary>
         /// 热线工单归档---服务工单结果

+ 4 - 2
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -51,8 +51,10 @@ public partial class Workflow : CreationEntity
     /// <summary>
     /// 办理时间限制(如:24小时、7个工作日)
     /// </summary>
-    public string? TimeLimitText { get; set; }
-    public int? TimeLimit { get; set; }
+    public string? TimeLimit { get; set; }
+
+    public int? TimeLimitCount { get; set; }
+
     public ETimeType? TimeLimitUnit { get; set; } = ETimeType.WorkDay;
 
     #endregion

+ 6 - 6
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -56,12 +56,12 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         public async Task<Workflow> CreateWorkflowAsync(WorkflowModule wfModule, string title, string userId, string userCode,
-            string? externalId = null, string? timelimitText = null, DateTime? expiredTime = null, CancellationToken cancellationToken = default)
+            string? externalId = null, string? timelimit = null, DateTime? expiredTime = null, CancellationToken cancellationToken = default)
         {
             var definition = wfModule.Definition;
             if (definition is null)
                 throw new UserFriendlyException("无效流程模板");
-            timelimitText ??= "1个自然日";
+            timelimit ??= "1个自然日";
             var workflow = new Workflow
             {
                 Title = title,
@@ -72,7 +72,7 @@ namespace Hotline.FlowEngine.Workflows
                 Status = EWorkflowStatus.Runnable,
                 //TimeLimit = GetConfig(definition.Code).Days,
                 //TimeLimitUnit = 
-                TimeLimitText = timelimitText,
+                TimeLimit = timelimit,
                 ExpiredTime = expiredTime.HasValue ? expiredTime.Value : DateTime.Now.AddDays(1),
                 Steps = new(),
                 Traces = new(),
@@ -708,13 +708,13 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 更新期满时间
         /// </summary>
-        public async Task UpdateExpiredTimeAsync(Workflow workflow, DateTime expiredTime, string timelimitText, int? timelimite,
+        public async Task UpdateExpiredTimeAsync(Workflow workflow, DateTime expiredTime, string timelimit, int? timelimiteCount,
             ETimeType? timelimitUnit, CancellationToken cancellationToken)
         {
             workflow.ExpiredTime = expiredTime;
-            workflow.TimeLimit = timelimite;
+            workflow.TimeLimit = timelimit;
             workflow.TimeLimitUnit = timelimitUnit;
-            workflow.TimeLimitText = timelimitText;
+            workflow.TimeLimitCount = timelimiteCount;
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
         }
 

+ 5 - 28
src/Hotline/Orders/Order.cs

@@ -23,10 +23,8 @@ namespace Hotline.Orders
         /// <summary>
         /// 第一次评价结果
         /// </summary>
-        [SugarColumn(IsNullable = true, DefaultValue = "")]
         public string? FirstVisitResult { get; set; }
 
-        [SugarColumn(IsNullable = true, DefaultValue = "")]
         public string? FirstVisitResultCode { get; set; }
 
         #region 来电信息
@@ -43,25 +41,21 @@ namespace Hotline.Orders
         /// <summary>
         /// 渠道为电话时,此字段存在(Call.Id)
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? CallId { get; set; }
 
         /// <summary>
         /// 来电归属地
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? CallAddress { get; set; }
 
         /// <summary>
         /// 来电号码
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? FromPhone { get; set; }
 
         /// <summary>
         /// 转接号码(转接来源)
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? TransferPhone { get; set; }
 
         /// <summary>
@@ -82,25 +76,20 @@ namespace Hotline.Orders
         /// <summary>
         /// 证件类型
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? LicenceTypeCode { get; set; }
 
-        [SugarColumn(IsNullable = true)]
         public string? LicenceType { get; set; }
 
         /// <summary>
         /// 证件号码
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? LicenceNo { get; set; }
 
         /// <summary>
         /// 年龄段
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? AgeRangeCode { get; set; }
 
-        [SugarColumn(IsNullable = true)]
         public string? AgeRange { get; set; }
 
         /// <summary>
@@ -125,7 +114,6 @@ namespace Hotline.Orders
         /// <summary>
         /// 是否保密
         /// </summary>
-        [SugarColumn(DefaultValue = "t")]
         public bool IsSecret { get; set; }
 
         /// <summary>
@@ -141,12 +129,12 @@ namespace Hotline.Orders
         /// <summary>
         /// 工单类型
         /// </summary>
-        public EOrderType OrderType { get; set; }
+        public string OrderType { get; set; }
+        public string OrderTypeCode { get; set; }
 
         /// <summary>
         /// 受理类型
         /// </summary>
-        //public EAcceptType AcceptType { get; set; }
         public string AcceptType { get; set; }
 
         public string AcceptTypeCode { get; set; }
@@ -172,7 +160,6 @@ namespace Hotline.Orders
         /// <summary>
         /// 外部数据(为前端提供级联功能)
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? HotspotExternal { get; set; }
 
         #endregion
@@ -196,10 +183,8 @@ namespace Hotline.Orders
         /// <summary>
         /// 推送分类
         /// </summary>
-        [SugarColumn(IsNullable = true)]
         public string? PushTypeCode { get; set; }
 
-        [SugarColumn(IsNullable = true)]
         public string? PushType { get; set; }
 
         /// <summary>
@@ -236,7 +221,6 @@ namespace Hotline.Orders
         /// <summary>
         /// 处理方式(直办、交办)
         /// </summary>
-        [SugarColumn(DefaultValue = "10")]
         public EProcessType ProcessType { get; set; } = EProcessType.Zhiban;
 
         ///// <summary>
@@ -331,7 +315,6 @@ namespace Hotline.Orders
         /// <summary>
         /// 办理时间限制(如:24小时、7个工作日)
         /// </summary>
-        [SugarColumn(IsNullable = true, DefaultValue = "")]
         public string? TimeLimit { get; set; }
 
         public int? TimeLimitCount { get; set; }
@@ -576,18 +559,12 @@ namespace Hotline.Orders
         /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
         public Workflow Workflow { get; set; }
-
-        /// <summary>
-        /// 工单扩展信息(12315-投诉)
-        /// </summary>
-        [Navigate(NavigateType.OneToOne, nameof(Id))]
-        public OrderComplain OrderComplain { get; set; }
-
+        
         /// <summary>
-        /// 工单扩展信息(12315-举报)
+        /// 工单扩展信息
         /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(Id))]
-        public OrderReport OrderReport { get; set; }
+        public OrderExtension OrderExtension { get; set; }
 
         /// <summary>
         /// 已发布工单

+ 0 - 2
src/Hotline/Orders/OrderComplain.cs

@@ -27,10 +27,8 @@ public class OrderComplain : OrderExtensionEntity
     /// <summary>
     /// 投诉目标,销售方式为“网购”时展示该字段且必填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ComplainTargetCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? ComplainTarget { get; set; }
 
     /// <summary>

+ 12 - 17
src/Hotline/Orders/OrderDomainService.cs

@@ -75,27 +75,22 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 
     public async Task<string> AddAsync(Order order, CancellationToken cancellationToken)
     {
-        if (order.OrderType == EOrderType.MarketSupervisionBy12315 && order.AcceptTypeCode == AcceptTypeConst.TouSu && order.OrderComplain == null)
-            throw UserFriendlyException.SameMessage("非法投诉参数");
-        if (order.OrderType == EOrderType.MarketSupervisionBy12315 && order.AcceptTypeCode == AcceptTypeConst.JuBao && order.OrderReport == null)
-            throw UserFriendlyException.SameMessage("非法举报参数");
-
         order.Init(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo);
         order.No = GenerateNewOrderNo();
         order.Password = "12345";//todo
 
-        if (order.SourceChannelCode == OrderDefaults.SourceChannel.DianHua && !string.IsNullOrEmpty(order.CallId))
-        {
-            var callRecord = await _wexCallRecordRepository.GetAsync(x => x.CallId == order.CallId,cancellationToken);
-            if (callRecord != null)
-            {
-                await _capPublisher.PublishAsync(EventNames.HotlineCallConnectWithOrder, new CallConnectOrderDto
-                {
-                    Order = _mapper.Map<OrderDto>(order),
-                    CallRecord = _mapper.Map<CallRecordDto>(callRecord)
-                }, cancellationToken: cancellationToken);
-            }
-        }
+        //if (order.SourceChannelCode == OrderDefaults.SourceChannel.DianHua && !string.IsNullOrEmpty(order.CallId))
+        //{
+        //    var callRecord = await _wexCallRecordRepository.GetAsync(x => x.CallId == order.CallId,cancellationToken);
+        //    if (callRecord != null)
+        //    {
+        //        await _capPublisher.PublishAsync(EventNames.HotlineCallConnectWithOrder, new CallConnectOrderDto
+        //        {
+        //            Order = _mapper.Map<OrderDto>(order),
+        //            CallRecord = _mapper.Map<CallRecordDto>(callRecord)
+        //        }, cancellationToken: cancellationToken);
+        //    }
+        //}
         return await _orderRepository.AddOrderNavAsync(order, cancellationToken);
     }
 

+ 545 - 0
src/Hotline/Orders/OrderExtension.cs

@@ -0,0 +1,545 @@
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Order;
+using SqlSugar;
+using XF.Domain.Entities;
+using XF.Domain.Events;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders;
+
+public class OrderExtension : CreationEntity
+{
+    /// <summary>
+    /// 工单类型
+    /// </summary>
+    public string OrderType { get; set; }
+    public string OrderTypeCode { get; set; }
+
+    #region 投诉人信息
+
+    /// <summary>
+    /// 证件类型
+    /// </summary>
+    public string? LicenceTypeCode { get; set; }
+
+    public string? LicenceType { get; set; }
+
+    /// <summary>
+    /// 证件号码, 证件类型已选的情况为必填,否则非必填
+    /// </summary>
+    public string? LicenceNo { get; set; }
+
+    /// <summary>
+    /// 提供方身份类型
+    /// </summary>
+    public string? IdentityTypeCode { get; set; }
+
+    public string? IdentityType { get; set; }
+
+    /// <summary>
+    /// 提供方身份(投诉人身份)
+    /// </summary>
+    public string? IdentityCode { get; set; }
+
+    public string? Identity { get; set; }
+
+    /// <summary>
+    /// 国籍或地区
+    /// </summary>
+    public string? NationalityCode { get; set; }
+
+    public string? Nationality { get; set; }
+
+    /// <summary>
+    /// 民族
+    /// </summary>
+    public string? NationCode { get; set; }
+
+    public string? Nation { get; set; }
+
+    /// <summary>
+    /// 邮政编码
+    /// </summary>
+    public string? PostalCode { get; set; }
+
+    /// <summary>
+    /// 邮箱
+    /// </summary>
+    public string? Email { get; set; }
+
+    /// <summary>
+    /// 其他联系方式
+    /// </summary>
+    public string? OtherContact { get; set; }
+
+    #endregion
+
+    #region 投诉对象信息
+
+    /// <summary>
+    /// 企业名称
+    /// </summary>
+    public string EnterpriseName { get; set; }
+
+    /// <summary>
+    /// 统一社会信用代码
+    /// </summary>
+    public string? UnifiedSocialCreditCode { get; set; }
+
+    /// <summary>
+    /// 注册地址
+    /// </summary>
+    public string RegisterAddress { get; set; }
+
+    /// <summary>
+    /// 注册号
+    /// </summary>
+    public string? RegisterNumber { get; set; }
+
+    /// <summary>
+    /// 企业联系人
+    /// </summary>
+    public string? EnterpriseContact { get; set; }
+
+    /// <summary>
+    /// 市场主体类型
+    /// </summary>
+    public string? MarketTypeCode { get; set; }
+
+    public string? MarketType { get; set; }
+
+    /// <summary>
+    /// 行业分类
+    /// </summary>
+    public string? IndustryClassifyCode { get; set; }
+    public string? IndustryClassify { get; set; }
+
+    #endregion
+
+    #region 投诉/举报 详情
+
+
+    /// <summary>
+    /// 商品分类/品牌
+    /// </summary>
+    public string BrandCode { get; set; }
+
+    public string Brand { get; set; }
+
+    /// <summary>
+    /// 消费金额,只能填写数字,且只能填写非负数
+    /// </summary>
+    public decimal Amount { get; set; }
+
+    /// <summary>
+    /// 客体类别
+    /// </summary>
+    public string ObjectClassifyCode { get; set; }
+
+    public string ObjectClassify { get; set; }
+
+    /// <summary>
+    /// 销售方式
+    /// </summary>
+    public string SalesModeCode { get; set; }
+    public string SalesMode { get; set; }
+
+    /// <summary>
+    /// 电商平台,销售方式为“网购”时展示该字段且必填
+    /// </summary>
+    public string? ECommercePlatformCode { get; set; }
+
+    public string? ECommercePlatform { get; set; }
+
+    /// <summary>
+    /// 外部订单号,销售方式为“ 网购”时展示该字段且必填
+    /// </summary>
+    public string? ExternalOrderNo { get; set; }
+
+    /// <summary>
+    /// 销售渠道
+    /// <remarks>
+    /// 销售方式为“电视购物”“电话购物”“邮购”时展示该字段,且必填 1.电视购物 2.电话购物 3.邮购
+    /// </remarks>
+    /// </summary>
+    public string? SalesChannel { get; set; }
+    public string? SalesChannelCode { get; set; }
+
+    /// <summary>
+    /// 专利权人,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? Patentee { get; set; }
+
+    /// <summary>
+    /// 专利名称,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? PatentName { get; set; }
+
+    /// <summary>
+    /// 专利类型,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? PatentTypeCode { get; set; }
+
+    public string? PatentType { get; set; }
+
+    /// <summary>
+    /// 专利号,“投诉问题类别”为“专利”时展示该字段,选填
+    /// </summary>
+    public string? PatentNo { get; set; }
+
+    /// <summary>
+    /// 产品名称
+    /// </summary>
+    public string? ProductName { get; set; }
+
+    /// <summary>
+    /// 批准文号
+    /// </summary>
+    public string? ApprovalNumber { get; set; }
+
+    /// <summary>
+    /// 产品批号
+    /// </summary>
+    public string? ProductBatchNo { get; set; }
+
+    /// <summary>
+    /// 产品规格
+    /// </summary>
+    public string? ProductStandard { get; set; }
+
+    /// <summary>
+    /// 产品有效期
+    /// </summary>
+    public DateTime? ProductExpiredTime { get; set; }
+
+    /// <summary>
+    /// 生产厂家
+    /// </summary>
+    public string? Manufacturer { get; set; }
+
+    /// <summary>
+    /// 销售企业
+    /// </summary>
+    public string? SalesEnterprise { get; set; }
+
+    /// <summary>
+    /// 消费者地址
+    /// </summary>
+    public string? ConsumerAddress { get; set; }
+
+    #endregion
+
+    #region 投诉详情
+
+    /// <summary>
+    /// 投诉问题类别
+    /// </summary>
+    public string ComplainClassifyCode { get; set; }
+
+    public string ComplainClassify { get; set; }
+
+    /// <summary>
+    /// 争议发生时间
+    /// </summary>
+    public DateTime OccurrenceTime { get; set; }
+
+    /// <summary>
+    /// 投诉目标,销售方式为“网购”时展示该字段且必填
+    /// </summary>
+    public string? ComplainTargetCode { get; set; }
+
+    public string? ComplainTarget { get; set; }
+
+    /// <summary>
+    /// 经营地址,销售方式为“现场”时必填
+    /// </summary>
+    [SugarColumn(ColumnDataType = "json", IsJson = true)]
+    public Position? BusinessPosition { get; set; }
+
+    /// <summary>
+    /// 诉求内容,多选
+    /// </summary>
+    [SugarColumn(ColumnDataType = "json", IsJson = true)]
+    public List<Kv> ComplainTypes { get; set; } = new();
+
+    #endregion
+
+    #region 举报详情
+
+    /// <summary>
+    /// 举报问题类别
+    /// </summary>
+    public string ReportClassifyCode { get; set; }
+
+    public string ReportClassify { get; set; }
+
+    /// <summary>
+    /// 举报目标,销售方式为“网购”时展示该字段且必填
+    /// </summary>
+    public string? ReportTargetCode { get; set; }
+
+    public string? ReportTarget { get; set; }
+
+    #endregion
+
+    #region 医疗服务中心受理单
+
+    /// <summary>
+    /// 投诉医院名称
+    /// </summary>
+    public string? MedName { get; set; }
+
+    /// <summary>
+    /// 投诉医院地址
+    /// </summary>
+    public string? MedAddress { get; set; }
+
+    /// <summary>
+    /// 投诉医院科室
+    /// </summary>
+    public string? MedDepartment { get; set; }
+
+    /// <summary>
+    /// 投诉医院医生
+    /// </summary>
+    public string? MedDoctor { get; set; }
+
+    /// <summary>
+    /// 患者
+    /// </summary>
+    public string? MedPatient { get; set; }
+
+    /// <summary>
+    /// 就诊卡号
+    /// </summary>
+    public string? MedNo { get; set; }
+
+    /// <summary>
+    /// 身份证号
+    /// </summary>
+    public string? MedIdNo { get; set; }
+
+    #endregion
+
+    #region 电视购物及商铺购买退换货中心受理单
+
+    /// <summary>
+    /// 电视台(商铺)
+    /// </summary>
+    public string? ExchTv { get; set; }
+
+    /// <summary>
+    /// 购买时间
+    /// </summary>
+    public DateTime? ExchTradeTime { get; set; }
+
+    /// <summary>
+    /// 产品名称
+    /// </summary>
+    public string? ExchProduct { get; set; }
+
+    /// <summary>
+    /// 消费金额
+    /// </summary>
+    public double? ExchAmount { get; set; }
+
+    /// <summary>
+    /// 商家名称
+    /// </summary>
+    public string? ExchName { get; set; }
+
+    /// <summary>
+    /// 商家地址
+    /// </summary>
+    public string? ExchAddress { get; set; }
+
+    /// <summary>
+    /// 收货人
+    /// </summary>
+    public string? ExchConsignee { get; set; }
+
+    /// <summary>
+    /// 收货人地址
+    /// </summary>
+    public string? ExchConsigneeAddress { get; set; }
+
+    #endregion
+
+    #region 电视台虚假广告中心受理单
+
+    /// <summary>
+    /// 虚假广告电视台名称
+    /// </summary>
+    public string? AdTv { get; set; }
+
+    /// <summary>
+    /// 虚假广告产品名称
+    /// </summary>
+    public string? AdProduct { get; set; }
+
+    /// <summary>
+    /// 虚假广告具体内容
+    /// </summary>
+    public string? AdContent { get; set; }
+    #endregion
+
+    #region 高速公路投诉中心受理单
+
+    /// <summary>
+    /// 高速入口
+    /// </summary>
+    public string? ExpwyEntrance { get; set; }
+
+    /// <summary>
+    /// 高速出口
+    /// </summary>
+    public string? ExpwyExit { get; set; }
+
+    /// <summary>
+    /// 发生时间
+    /// </summary>
+    public DateTime? ExpwyTime { get; set; }
+
+    /// <summary>
+    /// 车牌号
+    /// </summary>
+    public string? ExpwyNo { get; set; }
+    #endregion
+
+    #region 四川政务服务网技术中心受理单
+
+    /// <summary>
+    /// 四川政务服务网账号
+    /// </summary>
+    public string? ZwfwwAccount { get; set; }
+
+    /// <summary>
+    /// 四川政务服务网联系方式
+    /// </summary>
+    public string? ZwfwwContact { get; set; }
+    #endregion
+
+    #region 四川省12366热线诉求交办单
+
+    /// <summary>
+    /// 主管税务机关(问题归属地)
+    /// </summary>
+    public string? Location12366Ts { get; set; }
+
+    /// <summary>
+    /// 被投诉单位或个人信息
+    /// </summary>
+    public string? Info12366Ts { get; set; }
+
+    /// <summary>
+    /// 12366的投诉类型
+    /// </summary>
+    public string? Type12366Ts { get; set; }
+    #endregion
+
+    #region 四川省12366热线咨询交办单
+
+    /// <summary>
+    /// 主管税务机关(问题归属地)
+    /// </summary>
+    public string? Location12366Zx { get; set; }
+
+    /// <summary>
+    /// 被投诉单位或个人信息
+    /// </summary>
+    public string? Info12366Zx { get; set; }
+    #endregion
+
+    #region 12328服务监督中心受理单
+
+    /// <summary>
+    /// 受理方式
+    /// </summary>
+    public string? AcceptType12328 { get; set; }
+
+    /// <summary>
+    /// 客户
+    /// </summary>
+    public string? Client12328 { get; set; }
+    #endregion
+
+    #region 邮政业消费者申诉受理单
+
+    /// <summary>
+    /// 申诉人姓名
+    /// </summary>
+    public string? MailClaimantName { get; set; }
+
+    /// <summary>
+    /// 申诉人电话
+    /// </summary>
+    public string? MailClaimantPhone { get; set; }
+
+    /// <summary>
+    /// 申诉人企业
+    /// </summary>
+    public string? MailClaimantEnterprise { get; set; }
+
+    /// <summary>
+    /// 寄件人姓名
+    /// </summary>
+    public string? MailSenderName { get; set; }
+    public string? MailSenderPhone { get; set; }
+    public string? MailSenderAddress { get; set; }
+
+    /// <summary>
+    /// 收件人姓名
+    /// </summary>
+    public string? MailReceiverName { get; set; }
+    public string? MailReceiverPhone { get; set; }
+    public string? MailReceiverAddress { get; set; }
+
+    /// <summary>
+    /// 涉及金额
+    /// </summary>
+    public string? MailAmount { get; set; }
+
+    /// <summary>
+    /// 是否联系快递公司投诉
+    /// </summary>
+    public bool? MailIsContacted { get; set; }
+
+    /// <summary>
+    /// 处理结果
+    /// </summary>
+    public string? MailResult { get; set; }
+    #endregion
+
+    #region 环保举报业务受理单
+
+    /// <summary>
+    /// 举报人邮箱
+    /// </summary>
+    public string? EpEmail { get; set; }
+
+    /// <summary>
+    /// 举报人通讯地址
+    /// </summary>
+    public string? EpAddress { get; set; }
+
+    /// <summary>
+    /// 举报对象
+    /// </summary>
+    public string? EpObject { get; set; }
+
+    /// <summary>
+    /// 被举报对象地址
+    /// </summary>
+    public string? EpObjectAddress { get; set; }
+
+    /// <summary>
+    /// 对应行业类型
+    /// </summary>
+    public string? EpIndustryType { get; set; }
+
+    /// <summary>
+    /// 重点要素
+    /// </summary>
+    public string? EpKeyPoint { get; set; }
+    #endregion
+}

+ 0 - 36
src/Hotline/Orders/OrderExtensionEntity.cs

@@ -12,70 +12,56 @@ public abstract class OrderExtensionEntity : FullStateEntity
     /// <summary>
     /// 证件类型
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? LicenceTypeCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? LicenceType { get; set; }
 
     /// <summary>
     /// 证件号码, 证件类型已选的情况为必填,否则非必填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? LicenceNo { get; set; }
 
     /// <summary>
     /// 提供方身份类型
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? IdentityTypeCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? IdentityType { get; set; }
 
     /// <summary>
     /// 提供方身份(投诉人身份)
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? IdentityCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? Identity { get; set; }
 
     /// <summary>
     /// 国籍或地区
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? NationalityCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? Nationality { get; set; }
 
     /// <summary>
     /// 民族
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? NationCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? Nation { get; set; }
 
     /// <summary>
     /// 邮政编码
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? PostalCode { get; set; }
 
     /// <summary>
     /// 邮箱
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? Email { get; set; }
 
     /// <summary>
     /// 其他联系方式
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? OtherContact { get; set; }
 
     #endregion
@@ -90,7 +76,6 @@ public abstract class OrderExtensionEntity : FullStateEntity
     /// <summary>
     /// 统一社会信用代码
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? UnifiedSocialCreditCode { get; set; }
 
     /// <summary>
@@ -101,30 +86,24 @@ public abstract class OrderExtensionEntity : FullStateEntity
     /// <summary>
     /// 注册号
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? RegisterNumber { get; set; }
 
     /// <summary>
     /// 企业联系人
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? EnterpriseContact { get; set; }
 
     /// <summary>
     /// 市场主体类型
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? MarketTypeCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? MarketType { get; set; }
 
     /// <summary>
     /// 行业分类
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? IndustryClassifyCode { get; set; }
-    [SugarColumn(IsNullable = true)]
     public string? IndustryClassify { get; set; }
 
     #endregion
@@ -160,16 +139,13 @@ public abstract class OrderExtensionEntity : FullStateEntity
     /// <summary>
     /// 电商平台,销售方式为“网购”时展示该字段且必填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ECommercePlatformCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? ECommercePlatform { get; set; }
 
     /// <summary>
     /// 外部订单号,销售方式为“ 网购”时展示该字段且必填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ExternalOrderNo { get; set; }
 
     /// <summary>
@@ -184,52 +160,43 @@ public abstract class OrderExtensionEntity : FullStateEntity
     /// <summary>
     /// 专利权人,“投诉问题类别”为“专利”时展示该字段,选填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? Patentee { get; set; }
 
     /// <summary>
     /// 专利名称,“投诉问题类别”为“专利”时展示该字段,选填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? PatentName { get; set; }
 
     /// <summary>
     /// 专利类型,“投诉问题类别”为“专利”时展示该字段,选填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? PatentTypeCode { get; set; }
 
-    [SugarColumn(IsNullable = true)]
     public string? PatentType { get; set; }
 
     /// <summary>
     /// 专利号,“投诉问题类别”为“专利”时展示该字段,选填
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? PatentNo { get; set; }
 
     /// <summary>
     /// 产品名称
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ProductName { get; set; }
 
     /// <summary>
     /// 批准文号
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ApprovalNumber { get; set; }
 
     /// <summary>
     /// 产品批号
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ProductBatchNo { get; set; }
 
     /// <summary>
     /// 产品规格
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ProductStandard { get; set; }
 
     /// <summary>
@@ -240,19 +207,16 @@ public abstract class OrderExtensionEntity : FullStateEntity
     /// <summary>
     /// 生产厂家
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? Manufacturer { get; set; }
 
     /// <summary>
     /// 销售企业
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? SalesEnterprise { get; set; }
 
     /// <summary>
     /// 消费者地址
     /// </summary>
-    [SugarColumn(IsNullable = true)]
     public string? ConsumerAddress { get; set; }
 
     #endregion