Browse Source

修复政民互动直派工单未推送协同数据

tangjiang 4 months ago
parent
commit
1637408e43

+ 998 - 0
src/DataSharing.Host/Controllers/ZiGong/DockingPlatformController.cs

@@ -0,0 +1,998 @@
+using DataSharing.FwDataExchange;
+using DataSharing.RawData;
+using DataSharing.Share.Dtos.HotlineSetting;
+using DataSharing.Share.Dtos.YiBin.ConvergenceMedia;
+using DataSharing.YiBin.ConvergenceMedia;
+using Hotline.Share.Dtos.DataSharingSearch;
+using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos;
+using Hotline.Share.Enums.Order;
+using MapsterMapper;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json.Linq;
+using XF.Domain.Filters;
+using XF.Domain.Repository;
+using DataSharing.Share.Dtos;
+using DataSharing.Share.Dtos.ZiGong.DockingPlatform;
+using System.Net;
+using System.Text;
+using Newtonsoft.Json;
+
+namespace DataSharing.Host.Controllers.ZiGong
+{
+    /// <summary>
+    /// 自贡12345天府通办、自贡12345观察
+    /// </summary>
+    public class DockingPlatformController: BaseController
+    {
+        #region 注入
+        private readonly IMapper _mapper;
+        private readonly IChannelConfigurationManager _channelConfigurationManager;
+        private readonly IRepository<DsReceiveMediaData> _dsReceiveMediaDataRepository;
+        private readonly FwClient _fwClient;
+        private readonly IDsUserTokenInfoService _dsUserTokenInfoService;
+        private readonly ISharingConfigurationManager _sharingConfigurationManager;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mapper"></param>
+        /// <param name="channelConfigurationManager"></param>
+        /// <param name="dsReceiveMediaDataRepository"></param>
+        /// <param name="fwClient"></param>
+        /// <param name="dsUserTokenInfoService"></param>
+        /// <param name="sharingConfigurationManager"></param>
+        public DockingPlatformController(IMapper mapper,
+            IChannelConfigurationManager channelConfigurationManager,
+            IRepository<DsReceiveMediaData> dsReceiveMediaDataRepository,
+            FwClient fwClient,
+            IDsUserTokenInfoService dsUserTokenInfoService,
+            ISharingConfigurationManager sharingConfigurationManager)
+        {
+            _mapper = mapper;
+            _channelConfigurationManager = channelConfigurationManager;
+            _dsReceiveMediaDataRepository = dsReceiveMediaDataRepository;
+            _fwClient = fwClient;
+            _dsUserTokenInfoService = dsUserTokenInfoService;
+            _sharingConfigurationManager = sharingConfigurationManager;
+        }
+        #endregion
+
+        /// <summary>
+        /// 2.1写信---1 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("WriteOrder")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> WriteOrder([FromForm] WriteOrderReceiveDto dto)
+        {
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                    new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", Msg = "密钥错误", Code = "-900" }
+                };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Failed(responseDtos, "0", "密钥错误"));
+            }
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+            {
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                    new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", Msg = strResult, Code = "0" }
+                };
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Failed(responseDtos, "0", description: strResult));
+            }
+
+            //写入原始数据
+            DsReceiveMediaData dsReceiveMediaData = new()
+            {
+                ServiceInterface = "WriteOrder",
+                PlatformsName = accountDto.PlatformSourceName,
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
+            };
+            dsReceiveMediaData.Id = await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+            AddOrderDto data = new()
+            {
+                Title = dto.Title,
+                FromName = dto.LinkName,
+                Contact = dto.Mobile,
+                FullAddress = dto.Address,
+                Content = dto.Content,
+                IsSecret = dto.Secrecy == 0 ? false : true,
+                Source = (Hotline.Share.Enums.Order.ESource)System.Enum.Parse(typeof(Hotline.Share.Enums.Order.ESource), accountDto.PlatformSource),
+                FromGender = dto.Gender switch
+                {
+                    "1" => Hotline.Share.Enums.Order.EGender.Male,
+                    "2" => Hotline.Share.Enums.Order.EGender.Female,
+                    _ => Hotline.Share.Enums.Order.EGender.Unknown,
+                },
+                IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen,
+                Transpond = false,
+                IsEnforcementOrder = false,
+                ExternalId = Guid.NewGuid().ToString()
+            };
+
+            switch (accountDto.PlatformSource)
+            {
+                case "ZGGC":
+                    data.SourceChannel = "自贡观察";
+                    data.SourceChannelCode = "observe";
+                    break;
+                case "ZGTFTB":
+                    data.SourceChannel = "天府通办";
+                    data.SourceChannelCode = "TFTB001";
+                    break;
+                default:
+                    break;
+            }
+
+            switch (dto.PurTypeID)
+            {
+                case 17:
+                    data.AcceptType = "咨询";
+                    data.AcceptTypeCode = "10";
+                    break;
+                case 18:
+                    data.AcceptType = "举报";
+                    data.AcceptTypeCode = "30";
+                    break;
+                case 19:
+                    data.AcceptType = "投诉";
+                    data.AcceptTypeCode = "35";
+                    break;
+                case 20:
+                    data.AcceptType = "求助";
+                    data.AcceptTypeCode = "20";
+                    break;
+                case 21:
+                    data.AcceptType = "建议";
+                    data.AcceptTypeCode = "15";
+                    break;
+                case 1906:
+                    data.AcceptType = "表扬";
+                    data.AcceptTypeCode = "25";
+                    break;
+                default:
+                    data.AcceptType = "咨询";
+                    data.AcceptTypeCode = "10";
+                    break;
+            }
+
+            string areaName = "";
+            switch (dto.AreaID)
+            {
+                case 2:
+                    data.AreaCode = "510302"; areaName = "自流井区";
+                    break;
+                case 3:
+                    data.AreaCode = "510303"; areaName = "贡井区";
+                    break;
+                case 4:
+                    data.AreaCode = "510304"; areaName = "大安区";
+                    break;
+                case 5:
+                    data.AreaCode = "510311"; areaName = "沿滩区";
+                    break;
+                case 6:
+                    data.AreaCode = "510321"; areaName = "荣县";
+                    break;
+                case 7:
+                    data.AreaCode = "510322"; areaName = "富顺县";
+                    break;
+                case 59:
+                    data.AreaCode = "519800"; areaName = "高新区";
+                    break;
+                default:
+                    break;
+            }
+            data.Address = "四川省自贡市" + areaName;
+
+            //调用工单创建接口
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data));
+            if (result != null && result.code == 0)
+            {
+                dsReceiveMediaData.ExternalId = result.result.id;
+                dsReceiveMediaData.OrderCode = result.result.no;
+                await _dsReceiveMediaDataRepository.UpdateAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                    new WriteOrderResponseDto() { AcceptCode = result.result.no, AcceptPwd = result.result.password, Msg = "写信成功", Code = "1" }
+                };
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Success(responseDtos, "您已成功提交数据!"));
+            }
+            else
+            {
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                  new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", Msg = "接口调用失败", Code = "0" }
+                };
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Failed(responseDtos, "0", description: "接口调用失败!"));
+            }
+
+        }
+
+        /// <summary>
+        /// 2.2工单列表---1
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("GetOrderByList")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetOrderByList([FromForm] GetOrderMediaReceiveDto dto)
+        {
+            //密钥验证
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            //数据处理
+            string acceptTypeCode = dto.PurTypeID switch
+            {
+                17 => "10",
+                18 => "30",
+                19 => "35",
+                20 => "20",
+                21 => "15",
+                25 => "40",
+                _ => "",
+            };
+            GetOrderList orderList = new()
+            {
+                SourceChannelCode = GetChannelCode(accountDto.PlatformSource),
+                No = dto.AcceptCode,
+                Title = dto.Title,
+                Mobile = dto.Mobile,
+                AcceptTypeCode = acceptTypeCode,
+                StartTime = string.IsNullOrEmpty(dto.StartDate) == true ? null : Convert.ToDateTime(dto.StartDate),
+                EndTime = string.IsNullOrEmpty(dto.EndDate) == true ? null : Convert.ToDateTime(dto.EndDate).AddDays(1),
+                PageIndex = dto.CurrentPage,
+                PageSize = dto.PageSize,
+                HandleStateCode = dto.HandleStateCode,
+            };
+
+            List<GetOrderMediaDataListDto> listData = [];
+            string strFromType = "IYB";
+            if (accountDto.PlatformSource == "ConvergenceMedia")
+            {
+                strFromType = "ybrmt";
+            }
+            //查询旧系统
+            Dictionary<string, object> dic = new Dictionary<string, object>
+                {
+                    { "AcceptCode", dto.AcceptCode },
+                    { "Title", dto.Title },
+                    { "Mobile", dto.Mobile},
+                    { "PurTypeID", dto.PurTypeID},
+                    { "HandleStateCode", dto.HandleStateCode},
+                    { "StartDate", dto.StartDate},
+                    { "EndDate", dto.EndDate},
+                    {"StrFromType",strFromType },
+                    { "CurrentPage", 1},
+                    { "PageSize", 500 },
+                };
+            var strUrl = _sharingConfigurationManager.GetYiBinConfig().IYB.QueryOldList + "yb12345/iyb.asmx/GetOrderByListNew";
+            var strResultData = e_SendHttpPostBySync(strUrl, dic);
+            if (!string.IsNullOrEmpty(strResultData))
+            {
+                JObject job = (JObject)JsonConvert.DeserializeObject(strResultData);
+                if (job != null && "1" == job["code"].ToString())
+                {
+                    if (!string.IsNullOrEmpty(job["dataInfo"].ToString()) && !string.IsNullOrEmpty(job["dataInfo"]["data"].ToString()))
+                    {
+                        listData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GetOrderMediaDataListDto>>(job["dataInfo"]["data"].ToString().ToString());
+                    }
+                }
+            }
+
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientDataSharingResponse<PagedDto<OrderDto>>>("api/v1/DataSharing/get_order_list_own",
+                "Post", System.Text.Json.JsonSerializer.Serialize(orderList));
+            int nPageCount = 0;
+            if (result != null && result.code == 0)
+            {
+                if (result.result.Items != null && result.result.Items.Count > 0)
+                {
+                    //计算总页数
+                    nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(result.result.Total) / dto.PageSize));
+                    int rowID = 0;
+                    foreach (var item in result.result.Items)
+                    {
+                        rowID++;
+                        listData.Add(new GetOrderMediaDataListDto()
+                        {
+                            RowID = ((dto.CurrentPage - 1) * dto.PageSize) + rowID + "",
+                            FlowID = item.Id,
+                            Code = item.No,
+                            Title = item.Title,
+                            AddDate = item.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                            FromName = item.SourceChannel,
+                            PurTypeName = item.AcceptType,
+                            ResultState = item.Status >= EOrderStatus.Filed ? "办理完成" : "办理中"
+                        });
+                    }
+                }
+            }
+            var list = listData.OrderByDescending(p => p.AddDate).ToList();
+            int skip = dto.CurrentPage - 1;
+            List<GetOrderMediaDataListDto> listDataReturn = [];
+            listDataReturn = list.Skip(skip * dto.PageSize).Take(dto.PageSize).ToList();
+            int rowIDNew = 0;
+            foreach (var item in listDataReturn)
+            {
+                rowIDNew++;
+                item.RowID = ((dto.CurrentPage - 1) * dto.PageSize) + rowIDNew + "";
+            }
+            nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(list.Count) / dto.PageSize));
+
+            List<GetOrderMediaDataDto> returnData = new()
+            {
+            //处理返回
+            new()
+            {
+                PageCount = nPageCount,
+                data = listDataReturn
+            } };
+
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<GetOrderMediaDataDto>>.Success(returnData, "成功"));
+            
+        }
+
+        /// <summary>
+        /// 2.2工单列表---1
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("GetOrderByListiyb")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetOrderByListIyb([FromForm] GetOrderMediaReceiveDto dto)
+        {
+            //密钥验证
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            //数据处理
+            string acceptTypeCode = dto.PurTypeID switch
+            {
+                17 => "10",
+                18 => "30",
+                19 => "35",
+                20 => "20",
+                21 => "15",
+                25 => "40",
+                _ => "",
+            };
+            GetOrderList orderList = new()
+            {
+                SourceChannelCode = GetChannelCode(accountDto.PlatformSource),
+                No = dto.AcceptCode,
+                Title = dto.Title,
+                Mobile = dto.Mobile,
+                AcceptTypeCode = acceptTypeCode,
+                StartTime = string.IsNullOrEmpty(dto.StartDate) == true ? null : Convert.ToDateTime(dto.StartDate),
+                EndTime = string.IsNullOrEmpty(dto.EndDate) == true ? null : Convert.ToDateTime(dto.EndDate).AddDays(1),
+                PageIndex = dto.CurrentPage,
+                PageSize = dto.PageSize,
+                HandleStateCode = dto.HandleStateCode,
+            };
+
+            List<GetOrderMediaDataListDto> listData = [];
+            string strFromType = "IYB";
+            if (accountDto.PlatformSource == "ConvergenceMedia")
+            {
+                strFromType = "ybrmt";
+            }
+            //查询旧系统
+            Dictionary<string, object> dic = new Dictionary<string, object>
+                {
+                    { "AcceptCode", dto.AcceptCode },
+                    { "Title", dto.Title },
+                    { "Mobile", dto.Mobile},
+                    { "PurTypeID", dto.PurTypeID},
+                    { "HandleStateCode", dto.HandleStateCode},
+                    { "StartDate", dto.StartDate},
+                    { "EndDate", dto.EndDate},
+                    {"StrFromType",strFromType },
+                    { "CurrentPage", 1},
+                    { "PageSize", 500 },
+                };
+            var strUrl = _sharingConfigurationManager.GetYiBinConfig().IYB.QueryOldList + "yb12345/iyb.asmx/GetOrderByListNew";
+            var strResultData = e_SendHttpPostBySync(strUrl, dic);
+            if (!string.IsNullOrEmpty(strResultData))
+            {
+                JObject job = (JObject)JsonConvert.DeserializeObject(strResultData);
+                if (job != null && "1" == job["code"].ToString())
+                {
+                    if (!string.IsNullOrEmpty(job["dataInfo"].ToString()) && !string.IsNullOrEmpty(job["dataInfo"]["data"].ToString()))
+                    {
+                        listData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GetOrderMediaDataListDto>>(job["dataInfo"]["data"].ToString().ToString());
+                    }
+                }
+            }
+
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientDataSharingResponse<PagedDto<OrderDto>>>("api/v1/DataSharing/get_order_list_own",
+                "Post", System.Text.Json.JsonSerializer.Serialize(orderList));
+            int nPageCount = 0;
+            if (result != null && result.code == 0)
+            {
+                if (result.result.Items != null && result.result.Items.Count > 0)
+                {
+                    //计算总页数
+                    nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(result.result.Total) / dto.PageSize));
+                    int rowID = 0;
+                    foreach (var item in result.result.Items)
+                    {
+                        rowID++;
+                        listData.Add(new GetOrderMediaDataListDto()
+                        {
+                            RowID = ((dto.CurrentPage - 1) * dto.PageSize) + rowID + "",
+                            FlowID = item.Id,
+                            Code = item.No,
+                            Title = item.Title,
+                            AddDate = item.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                            FromName = item.SourceChannel,
+                            PurTypeName = item.AcceptType,
+                            ResultState = item.Status >= EOrderStatus.Filed ? "办理完成" : "办理中"
+                        });
+                    }
+                }
+            }
+            var list = listData.OrderByDescending(p => p.AddDate).ToList();
+            int skip = dto.CurrentPage - 1;
+            List<GetOrderMediaDataListDto> listDataReturn = [];
+            listDataReturn = list.Skip(skip * dto.PageSize).Take(dto.PageSize).ToList();
+            int rowIDNew = 0;
+            foreach (var item in listDataReturn)
+            {
+                rowIDNew++;
+                item.RowID = ((dto.CurrentPage - 1) * dto.PageSize) + rowIDNew + "";
+            }
+            nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(list.Count) / dto.PageSize));
+
+            List<GetOrderMediaDataDto> returnData = new()
+            {
+            //处理返回
+            new()
+            {
+                PageCount = nPageCount,
+                data = listDataReturn
+            } };
+
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<GetOrderMediaDataDto>>.Success(returnData, "成功"));
+
+        }
+
+        /// <summary>
+        /// 2.3 工单查询---1
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("GetOrderDetail")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetOrderDetail([FromForm] MediaOrderDetailReceiveDto dto)
+        {
+            //验证密钥
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo(strResult), "0", "失败"));
+            if (dto.AcceptCode.Length == 12)
+            {
+                Dictionary<string, object> dic = new Dictionary<string, object>
+                {
+                    { "AcceptCode", dto.AcceptCode },
+                    { "AcceptPwd", dto.AcceptPwd }
+                };
+                var strUrl = _sharingConfigurationManager.GetYiBinConfig().IYB.QueryOldList + "yb12345/iyb.asmx/GetOrderDetailNew";
+                var strResultData = e_SendHttpPostBySync(strUrl, dic);
+                if (!string.IsNullOrEmpty(strResultData))
+                {
+                    JObject job = (JObject)JsonConvert.DeserializeObject(strResultData);
+                    if (job != null && "1" == job["code"].ToString())
+                    {
+                        var recData = Newtonsoft.Json.JsonConvert.DeserializeObject<MediaOrderDetailDataDto>(job["dataInfo"].ToString());
+                        List<MediaOrderDetailDataDto> items = new() { recData };
+                        return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<MediaOrderDetailDataDto>>.Success(items, "成功"));
+                    }
+                }
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo("查询失败!"), "0", "失败"));
+            }
+            else
+            {
+                GetOrderNoPwdDto getOrder = new()
+                {
+                    No = dto.AcceptCode,
+                    Password = dto.AcceptPwd,
+                    SourceChannelCode = GetChannelCode(accountDto.PlatformSource)
+                };
+                var result = await _fwClient.RequestNoTokenAsync<HotlineClientDataSharingResponse<OrderDto>>("api/v1/DataSharing/get_order_detail_by_no_pwd",
+                    "Post", System.Text.Json.JsonSerializer.Serialize(getOrder));
+                List<MediaOrderDetailDataDto> items = new();
+                if (result != null && result.code == 0)
+                {
+                    if (result.result != null)
+                    {
+                        var item = result.result;
+                        items.Add(new()
+                        {
+                            FlowID = item.Id,
+                            FlowCode = item.No,
+                            FlowTitle = item.Title,
+                            FlowFromName = item.SourceChannel,
+                            FlowPurTypeName = item.AcceptType,
+                            FlowConTypeName = item.HotspotName,
+                            FlowAddDate = item.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                            FlowLKName = item.FromName,
+                            FlowBMName = item.ActualHandleOrgName,
+                            FlowRSFlagName = item.Status >= EOrderStatus.Filed ? "办理完成" : "办理中",
+                            FlowContent = item.Content,
+                            FlowResult = item.ActualOpinion,
+                            OrderFiles = GetOrderFiles(item.FileJson),
+                        });
+                    }
+                }
+                if (items == null || items.Count == 0)
+                    return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo("编号、密码错误!"), "0", "失败"));
+                else
+                    return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<MediaOrderDetailDataDto>>.Success(items, "成功"));
+            }
+        }
+
+        /// <summary>
+        /// 2.4 今日受理分类统计---1
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        [HttpPost("GetPurTypeReport")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetPurTypeReport([FromForm] string Code)
+        {
+            //验证密钥
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientDataSharingResponse<List<GetPurTypeReportDataDto>>>("api/v1/DataSharing/get_pur_type_report",
+               "Post", "");
+            List<GetPurTypeReportDataDto> data = new List<GetPurTypeReportDataDto>();
+            if (result != null && result.code == 0)
+            {
+                if (result.result != null)
+                {
+                    data = _mapper.Map<List<GetPurTypeReportDataDto>>(result.result);
+                }
+            }
+
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<GetPurTypeReportDataDto>>.Success(data, "成功"));
+        }
+
+        /// <summary>
+        /// 2.5 答复公开---1
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("GetOrderByListOpen")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetOrderByListOpen([FromForm] GetOrderMediaReceiveOpenDto dto)
+        {
+            //密钥验证
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            //数据处理
+            string acceptTypeCode = dto.PurTypeID switch
+            {
+                "17" => "10",
+                "18" => "30",
+                "19" => "35",
+                "20" => "20",
+                "21" => "15",
+                "25" => "40",
+                _ => "",
+            };
+            int pageIndex = string.IsNullOrEmpty(dto.CurrentPage) == true ? 1 : Convert.ToInt32(dto.CurrentPage);
+            int pageSize = string.IsNullOrEmpty(dto.PageSize) == true ? 1 : Convert.ToInt32(dto.PageSize);
+            GetOrderList getOrder = new GetOrderList()
+            {
+                Title = dto.Title,
+                AcceptTypeCode = acceptTypeCode,
+                StartTime = string.IsNullOrEmpty(dto.StartDate) == true ? null : Convert.ToDateTime(dto.StartDate),
+                EndTime = string.IsNullOrEmpty(dto.EndDate) == true ? null : Convert.ToDateTime(dto.EndDate).AddDays(1),
+                PageIndex = pageIndex,
+                PageSize = pageSize,
+            };
+
+            List<GetOrderMediaDataListDto> listData = [];
+
+            //查询新系统
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientDataSharingResponse<PagedDto<PublishOrderAllDto>>>("api/v1/DataSharing/get_order_list_publish_all",
+               "Post", System.Text.Json.JsonSerializer.Serialize(getOrder));
+            int nPageCount = 0;
+
+            if (result != null && result.code == 0)
+            {
+                if (result.result.Items != null && result.result.Items.Count > 0)
+                {
+                    //计算总页数
+                    nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(result.result.Total) / pageSize));
+                    int rowID = 0;
+                    foreach (var item in result.result.Items)
+                    {
+                        rowID++;
+                        listData.Add(new GetOrderMediaDataListDto()
+                        {
+                            RowID = ((pageIndex - 1) * pageSize) + rowID + "",
+                            FlowID = item.OrderId,
+                            Code = item.OrderNo,
+                            Title = item.Title,
+                            AddDate = item.AcceptTime.Value.ToString("yyyy-MM-dd HH:mm:ss"),
+                            FromName = item.SourceChannel,
+                            PurTypeName = item.AcceptType,
+                            ResultState = item.State,
+                            PubDate = item.PubDate.HasValue == true ? item.PubDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""
+                        });
+                    }
+                }
+            }
+
+            List<GetOrderMediaDataDto> dataDto = new()
+            {
+            //处理返回
+            new()
+            {
+                PageCount = nPageCount,
+                data = listData
+            } };
+
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<GetOrderMediaDataDto>>.Success(dataDto, "成功"));
+        }
+
+        /// <summary>
+        /// 2.6 办理明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("GetOrderByRun")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetOrderByRun([FromForm] MediaOrderDetailReceiveDto dto)
+        {
+            //密钥验证
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo(strResult), "0", "失败"));
+
+            GetOrderNoPwdDto getOrder = new()
+            {
+                No = dto.AcceptCode,
+                Password = dto.AcceptPwd,
+                SourceChannelCode = GetChannelCode(accountDto.PlatformSource)
+            };
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientDataSharingResponse<List<WorkflowTraceDto>>>("api/v1/DataSharing/get_workflow_by_no_pwd",
+                "Post", System.Text.Json.JsonSerializer.Serialize(getOrder));
+
+            List<GetOrderByRunDataDto> orderByRunData = new();
+            if (result != null && result.code == 0)
+            {
+                if (result.result != null && result.result.Count > 0)
+                {
+                    foreach (var item in result.result)
+                    {
+                        orderByRunData.Add(new GetOrderByRunDataDto()
+                        {
+                            BMName = item.HandlerOrgName,
+                            TTime = item.StepExpiredTime.HasValue == true ? item.StepExpiredTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
+                            DisposeDate = item.HandleTime.HasValue == true ? item.HandleTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""
+                        });
+                    }
+                }
+            }
+
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<GetOrderByRunDataDto>>.Success(orderByRunData, "成功"));
+        }
+
+        /// <summary>
+        /// 2.1.3 上传附件---1
+        /// </summary>
+        /// <param name="formData"></param>
+        /// <returns></returns>
+        [HttpPost("WriteFiles")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> WriteFiles([FromForm] IFormCollection formData)
+        {
+            string Code = formData["Code"];
+            string AcceptCode = formData["AcceptCode"];
+            string AcceptPwd = formData["AcceptPwd"];
+
+            //验证密钥
+            var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(Code, HttpContext.RequestAborted);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            //验证数据
+            if (string.IsNullOrEmpty(AcceptCode) || string.IsNullOrEmpty(AcceptPwd))
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<string>.Failed("编号、密码不能为空!", "0", "失败"));
+
+            var dataRaw = await _dsReceiveMediaDataRepository.GetAsync(p => p.OrderCode == AcceptCode, HttpContext.RequestAborted);
+       
+            IFormFileCollection files = formData.Files;//等价于Request.Form.Files
+
+            List<FileDto> fileDtos = new();
+
+            foreach (var item in files)
+            {
+                //这里需要上文件服务器上传
+                var businessFileDto = await SendFileData(item);
+
+                string strFileName = item.FileName;
+                string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".") + 1) : "";
+                string strSubFileName = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(0, strFileName.LastIndexOf(".")) : strFileName;
+                fileDtos.Add(new FileDto()
+                {
+                    Name = strSubFileName,
+                    Type = strSuffix,
+                    Classify = "受理上传",
+                    Additions = businessFileDto.id,
+                    Path = businessFileDto.path
+                });
+            }
+
+            UpdateOrderFilesDto updateOrderFiles = new()
+            {
+                Files = fileDtos,
+                Id = dataRaw.ExternalId,
+                OrderNo = dataRaw.OrderCode
+            };
+
+            //推送数据
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/update-orderfiles", "Post", System.Text.Json.JsonSerializer.Serialize(updateOrderFiles));
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<string>.Success("", "上传成功"));
+        }
+
+
+
+
+
+        #region 私有方法-将文件转化为文件流
+
+        /// <summary>
+        /// 组装附件参数
+        /// </summary>
+        /// <param name="fileJson"></param>
+        /// <returns></returns>
+        private List<GetFiles> GetOrderFiles(List<FileJson> fileJson)
+        {
+            var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile();
+            var baseUrl = businessFile.BaseUrl.Remove(businessFile.BaseUrl.Length - 1);
+            List<GetFiles> getFiles = [];
+            if (fileJson != null && fileJson.Count > 0)
+            {
+                foreach (var item in fileJson)
+                {
+                    GetFiles files = new()
+                    {
+                        FileID = item.FileId,
+                        FileName = item.FileName + "." + item.FileType,
+                        FileContent = baseUrl + item.Path
+                    };
+                    getFiles.Add(files);
+                }
+            }
+            return getFiles;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="platformSource"></param>
+        /// <returns></returns>
+        private string GetChannelCode(string platformSource)
+        {
+            var sourceChannelCode = "";
+            switch (platformSource)
+            {
+                case "ZGTFTB":
+                    sourceChannelCode = "TFTB001";
+                    break;
+                case "ZGGC":
+                    sourceChannelCode = "observe";
+                    break;
+                default:
+                    break;
+            }
+            return sourceChannelCode;
+        }
+
+        /// <summary>
+        /// 将文件流上传到附件服务器    
+        /// </summary>
+        /// <param name="file"></param>
+        /// <returns></returns>
+        private async Task<BusinessFileDto> SendFileData(IFormFile file)
+        {
+            var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile();
+            // 文件名称
+            string fileName = file.FileName;
+
+            // 文件内容字节数据
+            using var memoryStream = new MemoryStream();
+            await file.CopyToAsync(memoryStream);
+            memoryStream.Seek(0, SeekOrigin.Begin);
+            byte[] fileContentBytes = memoryStream.ToArray();
+
+            // 构造字典文件数据
+            // 接口参数名称为files
+            CFormUpload.FileParameter fileParameter = new CFormUpload.FileParameter("fileData", fileContentBytes, fileName, "multipart/form-data");
+
+            Dictionary<string, object> dicParam = new()
+            {
+                { fileName, fileParameter }
+            };
+            string url = string.Format("{0}{1}?source={2}", businessFile.BaseUrl, businessFile.UploadUrlAddress, businessFile.Source);
+            var result = CFormUpload.MultipartFormDataPost(url, null, dicParam, "");
+            if (!string.IsNullOrEmpty(result))
+            {
+                var resultData = Newtonsoft.Json.JsonConvert.DeserializeObject<BusinessFileResponse>(result);
+                if (resultData != null && resultData.code == 0)
+                {
+                    return resultData.result;
+                }
+            }
+            return new BusinessFileDto();
+        }
+
+        /// <summary>
+        /// POST 提交数据
+        /// </summary>
+        /// <param name="strUrl"> 地址</param>
+        /// <param name="headers">参数</param>
+        /// <param name="strEncoding"></param>
+        /// <param name="strContentType"></param>
+        /// <returns></returns>
+        private string e_SendHttpPostBySync(string strUrl, Dictionary<string, object> headers = null, string strEncoding = "UTF-8",
+            string strContentType = "application/x-www-form-urlencoded")
+        {
+            // 返回数据
+            string strResult = "";
+
+            try
+            {
+                ServicePointManager.Expect100Continue = false;
+                string postDataStr = SerializeDictionaryToParam2(headers);
+                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
+                request.Method = "POST";
+                request.ContentType = strContentType;
+                request.ContentLength = postDataStr.Length;
+
+                StreamWriter write = new StreamWriter(request.GetRequestStream(), Encoding.ASCII);
+                write.Write(postDataStr);
+                write.Flush();
+                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+                string encoding = "UTF-8";
+                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
+                strResult = reader.ReadToEnd();
+            }
+            catch (Exception ex)
+            {
+                strResult = "";
+            }
+            finally
+            {
+            }
+            return strResult;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="TKey"></typeparam>
+        /// <typeparam name="TValue"></typeparam>
+        /// <param name="dict"></param>
+        /// <returns></returns>
+        private string SerializeDictionaryToParam2<TKey, TValue>(Dictionary<TKey, TValue> dict)
+        {
+            string strParam = "";
+            int nIndex = 0;
+            foreach (var item in dict)
+            {
+                if (0 == nIndex)
+                    strParam += item.Key + "=" + item.Value;
+                else
+                    strParam += "&" + item.Key + "=" + item.Value;
+                nIndex++;
+            }
+            return strParam;
+        }
+        #endregion
+
+       
+    }
+}

+ 1 - 0
src/DataSharing.Host/README.md

@@ -42,6 +42,7 @@
 10:工单开启流程推送服务工单受理、电话服务记录,挂断电话推送电话服务记录,工单办理过程中推送服务工单处理,工单归档推送服务工单办结、服务工单受理、电话服务记录
 11:省上电话和工单关联是通过电话服务记录接口中的CASE_SERIAL字段关联
 12:批量推送汇聚数据注意:同一个批次中的数据省上要么只做新增要么只做更新、相近时间的也是同样操作(如果有3条数据,第一条是需要新增,后面都是更新,如果在同一批次中省上会将这三条数据都做新增操作)
+13:政民互动直派工单需要推送汇聚和协同两个业务,其他省下行数据只需要推送协同数据
 
 数据共享平台
 1、数据共享平台--->推送失败查询 可以查询市州推往其他平台失败的数据

+ 86 - 0
src/DataSharing.Share/Dtos/ZiGong/DockingPlatform/WriteOrderReceiveDto.cs

@@ -0,0 +1,86 @@
+namespace DataSharing.Share.Dtos.ZiGong.DockingPlatform
+{
+    public class WriteOrderReceiveDto
+    {
+        /// <summary>
+        /// 密钥
+        /// </summary>
+        [MDisplayName("密钥")]
+        [VRequired]
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 受理类型编码
+        /// </summary>
+        [MDisplayName("受理类型编码")]
+        [VRequired]
+        public int PurTypeID { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        [MDisplayName("标题")]
+        [VRequired]
+        [VStringLength(0, 200)]
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 来电人名称
+        /// </summary>
+        [MDisplayName("来电人名称")]
+        [VRequired]
+        [VStringLength(0, 20)]
+        public string LinkName { get; set; }
+
+        /// <summary>
+        /// 性别 0:未知,1:男,2:女
+        /// </summary>
+        [MDisplayName("性别")]
+        public string Gender { get; set; } = "0";
+
+        /// <summary>
+        /// 联系电话
+        /// </summary>
+        [MDisplayName("联系电话")]
+        [VRequired]
+        [VStringLength(0, 20)]
+        public string Mobile { get; set; }
+
+        /// <summary>
+        /// 邮箱
+        /// </summary>
+        [MDisplayName("邮箱")]
+        [VStringLength(0, 100)]
+        public string Mail { get; set; }
+
+        /// <summary>
+        /// 地址
+        /// </summary>
+        [MDisplayName("地址")]
+        [VRequired]
+        [VStringLength(0, 600)]
+        public string Address { get; set; }
+
+        /// <summary>
+        /// 内容
+        /// </summary>
+        [MDisplayName("内容")]
+        [VRequired]
+        [VStringLength(0, 2000)]
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 是否保密: 0、不保密 ;1、保密
+        /// </summary>
+        [MDisplayName("是否保密")]
+        [VRequired]
+        public int Secrecy { get; set; }
+
+        /// <summary>
+        /// 区域类型编码
+        /// </summary>
+        [MDisplayName("区域类型编码")]
+        [VRequired]
+        public int AreaID { get; set; }
+    }
+}

+ 1 - 1
src/DataSharing/DataSharing.csproj

@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="FluentValidation" Version="11.6.0" />
-    <PackageReference Include="Hotline.Share" Version="1.0.112" />
+    <PackageReference Include="Hotline.Share" Version="1.0.113" />
     <PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
     <PackageReference Include="Quartz.Jobs" Version="3.8.0" />
     <PackageReference Include="RestSharp" Version="110.2.0" />

+ 12 - 7
src/DataSharing/Province/ProvinceService.cs

@@ -585,8 +585,8 @@ namespace DataSharing.Province
 
             var configProvince = _channelConfigurationManager.GetConfigurationProvince();
 
-            //如果省上下来的工单走服务工单交办评价接口,不是省上派下来的工单,走服务工单评价接口
-            if (dto.Order.IsProvince && dto.Order.Source == ESource.ProvinceStraight)
+            //如果省上下来的工单走服务工单交办评价接口
+            if (dto.Order.Source == ESource.ProvinceStraight)
             {
                 var data = _mapper.Map<GetVisitInfoReceiveInfo>(dto);
 
@@ -610,7 +610,9 @@ namespace DataSharing.Province
                 //处理附件
                 await FileDataAsync(null, data.CaseSerial, data.CliengGuid, EMaterialType.Visit, data.AreaCode, cancellationToken);
             }
-            else
+
+            //如果不是省上派下来的工单或者省上来的工单,但是是政民互动直派的工单,需要推送已汇聚数据
+            if (dto.Order.Source != ESource.ProvinceStraight || (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince == false))
             {
                 var data = _mapper.Map<SubmitVisitInfo>(dto);
                 data.VisitType = visitType;
@@ -677,6 +679,7 @@ namespace DataSharing.Province
             if (!string.IsNullOrEmpty(dto.Order.ActualHandleOrgCode) && dto.Order.ActualHandleOrgCode == "001")
                 dto.Order.ActualHandleOrgName = "热线中心";
             var configProvince = _channelConfigurationManager.GetConfigurationProvince();
+
             //IsProvince 如果是false 则推送服务工单受理
             if (dto != null && dto.Order != null && !dto.Order.IsProvince)
             {
@@ -1191,7 +1194,7 @@ namespace DataSharing.Province
                 dto.Order.AreaCode = dto.Order.AreaCode.Substring(0, 6);
 
             //推省上的交办结果
-            if (dto.Order.IsProvince && dto.Order.Source == ESource.ProvinceStraight)
+            if (dto.Order.Source == ESource.ProvinceStraight)
             {
                 if (dto.Order.RealCommunicationMode == null)
                     dto.Order.RealCommunicationMode = ERealCommunicationMode.Phone;
@@ -1818,7 +1821,7 @@ namespace DataSharing.Province
                 dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
 
             //省上下来的工单走协同的接口
-            if (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince)
+            if (dto.Order.Source == ESource.ProvinceStraight)
             {
                 var data = _mapper.Map<GetCaseProcessReceiveInfo>(dto);
                 data.TacheName = "70:" + data.DeptName;
@@ -1841,7 +1844,9 @@ namespace DataSharing.Province
                 //处理附件
                 await FileDataAsync(dto.WorkflowTrace.FileJson, data.CaseSerial, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
             }
-            else  //如果不是省上派下来的工单
+
+            //如果不是省上派下来的工单或者省上来的工单,但是是政民互动直派的工单,需要推送已汇聚数据
+            if (dto.Order.Source != ESource.ProvinceStraight || (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince == false))
             {
                 //本地工单走市州接口
                 var data = _mapper.Map<SubmitCaseProcessInfo>(dto);
@@ -1886,7 +1891,7 @@ namespace DataSharing.Province
             data.HandleTimeLong = (int)dto.Order.AllDuration;
             data.CliengGuid = dto.WorkflowTrace.Id;
             data.EndAreaName = string.IsNullOrEmpty(dto.Order.ActualHandleOrgAreaName) == false ? dto.Order.ActualHandleOrgAreaName : _sharingConfigurationManager.GetCityName();
-           
+
             //宜宾工单不超期,如果在推送省上数据时,实际办理时间大于过期时间,则将办理时间改成过期时间减2个小时
             if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
             {