コード例 #1
0
        public async Task <ResultEntity> AddOrUpdateAsync(ExchangeObject exchangeObject)
        {
            var resultEntity = new ResultEntity();
            var existQuery   = _exchangeObjectRepository.GetQueryable().Where(a => a.Name == exchangeObject.Name);

            if (exchangeObject.Id > 0)
            {
                existQuery = existQuery.Where(a => a.Id != exchangeObject.Id);
            }

            if (await existQuery.CountAsync() > 0)
            {
                resultEntity.Message = "流转对象名称已存在";
            }
            else
            {
                if (exchangeObject.Id > 0)
                {
                    _exchangeObjectRepository.Update(exchangeObject);
                }
                else
                {
                    await _exchangeObjectRepository.AddAsync(exchangeObject);
                }

                resultEntity.Success = true;
            }

            return(resultEntity);
        }
コード例 #2
0
        public async Task <ResultEntity> GetCheckInfo(int userId, int placeId, DateTime beginTime, DateTime endTime)
        {
            var result      = new ResultEntity();
            var listInfo    = new List <string>();
            var managePlace = await _placeWardenRepository.GetQueryable().Include(a => a.Place).FirstOrDefaultAsync(a => a.UserId == userId);

            var place = await _placeRepository.GetQueryable().Include(a => a.Parent).FirstOrDefaultAsync(a => a.Id == placeId);

            if (managePlace == null)
            {
                result.Message = "非场所管理员,无法使用此功能";
                return(result);
            }

            if (managePlace.PlaceId == placeId)
            {
                if (place.ParentId == null)
                {
                    result.Message = "使用场所错误,无法核销";
                }
                else
                {
                    var objectIds = await _objectSignerRepository.GetQueryable().Where(a => a.UserId == userId)
                                    .Select(a => a.ExchangeObjectId).ToListAsync();

                    var receiveLogs = await _barcodeLogRepository.GetQueryable().Where(a =>
                                                                                       a.BarcodeStatus == EnumBarcodeStatus.已签收 && a.CurrentPlaceId == place.ParentId &&
                                                                                       a.OperationTime.Date >= beginTime.Date && a.OperationTime.Date <= endTime.Date && objectIds.Contains(a.CurrentObjectId)).Select(a => a.BarcodeNumber)
                                      .ToListAsync();

                    listInfo.Add($"场所【{place.Parent.Name}】取件【{receiveLogs.Count}】");
                    var sendLogs = await _barcodeLogRepository.GetQueryable().Where(a =>
                                                                                    a.BarcodeStatus == EnumBarcodeStatus.已投递 && a.CurrentPlaceId == placeId &&
                                                                                    a.OperationTime.Date >= beginTime.Date && a.OperationTime.Date <= endTime.Date && receiveLogs.Contains(a.BarcodeNumber)).Select(a => a.BarcodeNumber).ToListAsync();

                    listInfo.Add($"场所【{place.Name}】投件【{sendLogs.Count}】");
                    listInfo.Add(receiveLogs.Count == sendLogs.Count
                        ? "成功!所有文件已成功投递"
                        : $"警告!{receiveLogs.Count - sendLogs.Count}份文件尚未投递,请查看下方明细!");
                }
            }
            else
            {
                var insideObjects = await _exchangeObjectRepository.GetQueryable()
                                    .Where(a => a.ObjectType == EnumObjectType.道).Select(a => a.Id).ToListAsync();

                var receiveLogs = await _barcodeLogRepository.GetQueryable().Where(a =>
                                                                                   a.BarcodeStatus == EnumBarcodeStatus.已签收 && a.CurrentPlaceId == managePlace.PlaceId &&
                                                                                   a.OperationTime.Date >= beginTime.Date && a.OperationTime.Date <= endTime.Date && insideObjects.Contains(a.CurrentObjectId)).Select(a => a.BarcodeNumber)
                                  .ToListAsync();

                listInfo.Add($"场所【{managePlace.Place.Name}】取件【{receiveLogs.Count}】");
                var sendLogs = await _barcodeLogRepository.GetQueryable().Where(a =>
                                                                                a.BarcodeStatus == EnumBarcodeStatus.已投递 && a.CurrentPlaceId == placeId &&
                                                                                a.OperationTime.Date >= beginTime.Date && a.OperationTime.Date <= endTime.Date &&
                                                                                receiveLogs.Contains(a.BarcodeNumber)).Select(a => a.BarcodeNumber).ToListAsync();

                listInfo.Add($"场所【{place.Name}】投件【{sendLogs.Count}】");
                listInfo.Add(receiveLogs.Count == sendLogs.Count
                    ? "成功!所有文件已成功投递"
                    : $"警告!{receiveLogs.Count - sendLogs.Count}份文件尚未投递,请查看下方明细!");
            }
            result.Success = true;
            result.Data    = listInfo;
            return(result);
        }
コード例 #3
0
        private async Task <CheckBarcodeModel> CheckBarcodeTypeCommon(Letter letter, int placeId)
        {
            _logger.LogWarning($"进入通用逻辑");
            var checkBarcodeModel = new CheckBarcodeModel();

            if (letter.SendDepartmentId == 0)
            {
                _logger.LogWarning($"发件单位错误");
                return(checkBarcodeModel);
            }


            _logger.LogWarning($"信件类型:{letter.LetterType.ToString()}");
            switch (letter.LetterType)
            {
            case EnumLetterType.收信:
            {
                var exchangeObject = await _objectRepository.GetQueryable().Where(a =>
                                                                                  a.ObjectType == EnumObjectType.机构 && a.Value == letter.ReceiveDepartmentId)
                                     .FirstOrDefaultAsync();

                if (exchangeObject == null)
                {
                    _logger.LogWarning($"不存在的收件流转对象");
                    checkBarcodeModel.Type = EnumCheckBarcodeType.无效;
                    return(checkBarcodeModel);
                }
                var objectId = exchangeObject.Id;
                var boxs     = await _boxObjectRepository.GetQueryable()
                               .Where(a => a.Box.PlaceId == placeId && a.ExchangeObjectId == objectId && a.Box.Enabled && a.ExchangeObject.ObjectType != EnumObjectType.道)
                               .Select(a => a.Box).ToListAsync();

                if (boxs.Count > 0)
                {
                    _logger.LogWarning($"结束:当前场所存在收件箱格");
                    checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                    checkBarcodeModel.Record =
                        boxs.Select(a => new CheckedBarcodeRecord {
                            FileCount = 1, Message = "", No = a.Id
                        })
                        .ToList();
                }
                else
                {
                    _logger.LogWarning($"递归上级流转对象在本场所有箱格");
                    var parentObject = exchangeObject;
                    while (parentObject.ParentId != null)
                    {
                        var o = parentObject;
                        var tempParentObject = await _objectRepository.GetQueryable().Where(a => a.Id == o.ParentId.Value)
                                               .FirstOrDefaultAsync();

                        boxs = await _boxObjectRepository.GetQueryable()
                               .Where(a => a.Box.PlaceId == placeId && a.ExchangeObjectId == tempParentObject.Id && a.Box.Enabled)
                               .Select(a => a.Box).ToListAsync();

                        if (boxs.Count > 0)
                        {
                            _logger.LogWarning($"结束:存在上级流转对象箱格");
                            checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                            checkBarcodeModel.Record =
                                boxs.Select(a => new CheckedBarcodeRecord {
                                    FileCount = 1, Message = "", No = a.Id
                                })
                                .ToList();
                            return(checkBarcodeModel);
                        }

                        parentObject = tempParentObject;
                    }

                    if (exchangeObject.IsVirtual)
                    {
                        _logger.LogWarning($"收件流转对象为虚拟对象");
                        var childBoxs = await _boxObjectRepository.GetQueryable()
                                        .Where(a => a.Box.PlaceId == placeId && a.ExchangeObject.ParentId == exchangeObject.Id && a.Box.Enabled)
                                        .Select(a => a.Box).ToListAsync();

                        if (childBoxs.Count > 0)
                        {
                            checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                            checkBarcodeModel.Record =
                                childBoxs.Select(a => new CheckedBarcodeRecord {
                                    FileCount = 1, Message = "", No = a.Id
                                })
                                .ToList();
                            _logger.LogWarning($"结束:存在收件流转对象下级的箱格");
                            return(checkBarcodeModel);
                        }

                        boxs = await _boxObjectRepository.GetQueryable()
                               .Where(a => a.Box.PlaceId == placeId && a.Box.Enabled && a.ExchangeObject.ObjectType != EnumObjectType.道)
                               .Select(a => a.Box).ToListAsync();

                        checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                        checkBarcodeModel.Record =
                            boxs.Select(a => new CheckedBarcodeRecord {
                                FileCount = 1, Message = "", No = a.Id
                            })
                            .ToList();
                        _logger.LogWarning($"结束:除渠道箱外全部返回");
                        return(checkBarcodeModel);
                    }
                }

                break;
            }

            case EnumLetterType.发信:
            {
                var receiveDepartment = await _departmentRepository.GetByIdAsync(letter.ReceiveDepartmentId);

                var receiveChannel = receiveDepartment.ReceiveChannel;
                if (letter.SecretLevel == EnumSecretLevel.绝密)
                {
                    receiveChannel = EnumChannel.机要通信;
                }

                if (receiveChannel == EnumChannel.机要通信)
                {
                    //2018.12.26添加机要通信渠道箱不允许投非密件
                    if (letter.SecretLevel == EnumSecretLevel.普通)
                    {
                        _logger.LogWarning($"结束:非密件不允许走机要通信渠道");
                        return(checkBarcodeModel);
                    }
                    //2019.2.12添加直接到部级的单位不允许投箱
                    if (letter.BarcodeNo.Contains("015000"))
                    {
                        _logger.LogWarning($"结束:直接到部级不允许投箱");
                        return(checkBarcodeModel);
                    }
                }

                //同城渠道可以走直送
                var allowChannels = new List <int>();
                allowChannels.Add((int)receiveChannel);
                if (receiveChannel == EnumChannel.城交换)
                {
                    allowChannels.Add((int)EnumChannel.直送);
                }

                var channelExchangeObjects = await _objectRepository.GetQueryable().Where(a =>
                                                                                          a.ObjectType == EnumObjectType.道 && allowChannels.Contains(a.Value))
                                             .ToListAsync();

                if (channelExchangeObjects.Count > 0)
                {
                    var boxs = await _boxObjectRepository.GetQueryable()
                               .Where(a => a.Box.PlaceId == placeId && channelExchangeObjects.Exists(b => b.Id == a.ExchangeObjectId) && a.Box.Enabled)
                               .Select(a => a.Box).ToListAsync();

                    if (boxs.Count > 0)
                    {
                        checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                        checkBarcodeModel.Record = boxs.Select(a =>
                                                               new CheckedBarcodeRecord {
                                FileCount = 1, Message = "", No = a.Id
                            }).ToList();
                        _logger.LogWarning($"结束:存在对外的渠道箱");
                        return(checkBarcodeModel);
                    }

                    var currentSend = false;
                    var place       = await _placeRepository.GetByIdAsync(placeId);

                    var sendDepartment = await _departmentRepository.GetByIdAsync(letter.SendDepartmentId);

                    while (sendDepartment.ParentId != null)
                    {
                        if (place.DepartmentId == sendDepartment.Id)
                        {
                            currentSend = true;
                            break;
                        }

                        sendDepartment = await _departmentRepository.GetByIdAsync(sendDepartment.ParentId.Value);
                    }

                    if (currentSend)
                    {
                        var insideExchangeObjects = await _objectRepository.GetQueryable().Where(a =>
                                                                                                 a.ObjectType == EnumObjectType.道 && a.Value == (int)EnumChannel.内部)
                                                    .ToListAsync();

                        List <ExchangeObject> matchExchangeObjects;
                        if (receiveChannel == EnumChannel.城交换 && letter.SecretLevel != EnumSecretLevel.绝密)
                        {
                            matchExchangeObjects = insideExchangeObjects.Where(a => a.RestrictionCode.Contains("同城交换")).ToList();
                        }
                        else
                        {
                            matchExchangeObjects = insideExchangeObjects.Where(a => a.RestrictionCode.Contains("机要通信")).ToList();
                        }

                        if (matchExchangeObjects.Count > 0)
                        {
                            _logger.LogWarning($"结束:内部限制码渠道箱匹配成功");
                            boxs = await _boxObjectRepository.GetQueryable()
                                   .Where(a => a.Box.PlaceId == placeId && matchExchangeObjects.Any(b => b.Id == a.ExchangeObjectId) && a.Box.Enabled)
                                   .Select(a => a.Box).ToListAsync();

                            if (boxs.Count == 0)
                            {
                                _logger.LogWarning($"结束:内部渠道箱匹配成功");
                                boxs = await _boxObjectRepository.GetQueryable()
                                       .Where(a => a.Box.PlaceId == placeId && insideExchangeObjects.Any(b => b.Id == a.ExchangeObjectId) && a.Box.Enabled)
                                       .Select(a => a.Box).ToListAsync();
                            }
                        }
                        if (boxs.Count > 0)
                        {
                            checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                            checkBarcodeModel.Record = boxs.Select(a =>
                                                                   new CheckedBarcodeRecord {
                                    FileCount = 1, Message = "", No = a.Id
                                }).ToList();
                        }
                    }
                    else
                    {
                        checkBarcodeModel.Type = EnumCheckBarcodeType.无效;
                    }
                }
            }
            break;

            case EnumLetterType.内交换:
            {
                var exchangeObject = await _objectRepository.GetQueryable().Where(a =>
                                                                                  a.ObjectType == EnumObjectType.机构 && a.Value == letter.ReceiveDepartmentId)
                                     .FirstOrDefaultAsync();

                if (exchangeObject == null)
                {
                    _logger.LogWarning($"不存在的收件流转对象");
                    checkBarcodeModel.Type = EnumCheckBarcodeType.无效;
                    return(checkBarcodeModel);
                }
                var tempObject = exchangeObject;
                var boxs       = await _boxObjectRepository.GetQueryable()
                                 .Where(a => a.Box.PlaceId == placeId && a.ExchangeObjectId == tempObject.Id && a.Box.Enabled)
                                 .Select(a => a.Box).ToListAsync();

                if (boxs.Count > 0)
                {
                    checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                    checkBarcodeModel.Record =
                        boxs.Select(a => new CheckedBarcodeRecord {
                            FileCount = 1, Message = "", No = a.Id
                        })
                        .ToList();
                    _logger.LogWarning($"结束:当前场所下存在收件流转对象箱格");
                    return(checkBarcodeModel);
                }

                var parentObject = exchangeObject;
                while (parentObject.ParentId != null)
                {
                    var o = parentObject;
                    var tempParentObject = await _objectRepository.GetQueryable().Where(a => a.Id == o.ParentId.Value)
                                           .FirstOrDefaultAsync();

                    boxs = await _boxObjectRepository.GetQueryable()
                           .Where(a => a.Box.PlaceId == placeId && a.ExchangeObjectId == tempParentObject.Id && a.Box.Enabled)
                           .Select(a => a.Box).ToListAsync();

                    if (boxs.Count > 0)
                    {
                        checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                        checkBarcodeModel.Record =
                            boxs.Select(a => new CheckedBarcodeRecord {
                                FileCount = 1, Message = "", No = a.Id
                            })
                            .ToList();
                        _logger.LogWarning($"结束:存在流转对象上级对象箱格");
                        return(checkBarcodeModel);
                    }

                    parentObject = tempParentObject;
                }

                if (exchangeObject.IsVirtual)
                {
                    _logger.LogWarning($"流转对象为虚拟流转对象");
                    var childBoxs = await _boxObjectRepository.GetQueryable()
                                    .Where(a => a.Box.PlaceId == placeId && a.ExchangeObject.ParentId == exchangeObject.Id && a.Box.Enabled)
                                    .Select(a => a.Box).ToListAsync();

                    if (childBoxs.Count > 0)
                    {
                        _logger.LogWarning($"结束:存在流转对象子对象箱格");
                        checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                        checkBarcodeModel.Record =
                            childBoxs.Select(a => new CheckedBarcodeRecord {
                                FileCount = 1, Message = "", No = a.Id
                            })
                            .ToList();
                        return(checkBarcodeModel);
                    }
                }

                var currentSend = false;
                //判断是否是该场所下的单位发件
                var place = await _placeRepository.GetByIdAsync(placeId);

                var sendDepartment = await _departmentRepository.GetByIdAsync(letter.SendDepartmentId);

                while (sendDepartment.ParentId != null)
                {
                    if (place.DepartmentId == sendDepartment.Id)
                    {
                        currentSend = true;
                        break;
                    }
                    sendDepartment = await _departmentRepository.GetByIdAsync(sendDepartment.ParentId.Value);
                }

                if (currentSend)
                {
                    _logger.LogWarning($"当前场所下单位发件");
                    //当前场所下单位发件
                    var exchangeObjects = await _objectRepository.GetQueryable().Where(a =>
                                                                                       a.ObjectType == EnumObjectType.道 && a.Value == (int)EnumChannel.内部)
                                          .ToListAsync();

                    var receiveCode          = letter.GetReceiveCode(letter.BarcodeNo);
                    var matchExchangeObjects = exchangeObjects.Where(a => receiveCode.Contains(a.RestrictionCode)).ToList();
                    if (matchExchangeObjects.Count > 0)
                    {
                        if (matchExchangeObjects.Count > 1)
                        {
                            //匹配数量超过一个,排除限制码为空的对象
                            matchExchangeObjects = exchangeObjects.Where(a => receiveCode.Contains(a.RestrictionCode) && !string.IsNullOrWhiteSpace(a.RestrictionCode)).ToList();
                        }
                        boxs = await _boxObjectRepository.GetQueryable()
                               .Where(a => a.Box.PlaceId == placeId && matchExchangeObjects.Any(b => b.Id == a.ExchangeObjectId) && a.Box.Enabled)
                               .Select(a => a.Box).ToListAsync();

                        _logger.LogWarning($"结束:内部限制码渠道箱匹配成功");
                    }
                    else
                    {
                        boxs = await _boxObjectRepository.GetQueryable()
                               .Where(a => a.Box.PlaceId == placeId && exchangeObjects.Any(b => b.Id == a.ExchangeObjectId) && a.Box.Enabled)
                               .Select(a => a.Box).ToListAsync();

                        _logger.LogWarning($"结束:内部渠道箱匹配成功");
                    }
                    checkBarcodeModel.Type   = EnumCheckBarcodeType.唯一指定;
                    checkBarcodeModel.Record = boxs.Select(a =>
                                                           new CheckedBarcodeRecord {
                            FileCount = 1, Message = "", No = a.Id
                        }).ToList();
                }
                else
                {
                    checkBarcodeModel.Type = EnumCheckBarcodeType.无效;
                }
            }
            break;
            }
            return(checkBarcodeModel);
        }