| POST | /report/bm05/preview | ||
|---|---|---|---|
| POST | /report/bm05/to-excel |
import Foundation
import ServiceStack
/**
* Báo cáo BM05 - Preview dữ liệu
*/
public class PreviewBM05Report : ExportBM05Report
{
required public init(){ super.init() }
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
}
}
/**
* Báo cáo BM05 - Tra cứu VB QPPL & VB Nội bộ NPCETC
*/
public class ExportBM05Report : PagingRequest
{
public var title:String
public var typeId:Int?
public var groupId:Int?
public var subjectId:Int?
public var isUrgent:Bool?
public var documentSearchStage:DocumentSearchStage
public var isInternal:Bool?
public var fromDate:Date?
public var toDate:Date?
public var statusId:Int?
public var issuingAgencyId:Int?
public var orderBy:SearchOrderBy
public var isParty:Bool?
public var branchType:Int16?
public var effectBeginDateFrom:Date?
public var effectBeginDateTo:Date?
public var effectEndDateFrom:Date?
public var effectEndDateTo:Date?
public var departmentIds:[Int] = []
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case title
case typeId
case groupId
case subjectId
case isUrgent
case documentSearchStage
case isInternal
case fromDate
case toDate
case statusId
case issuingAgencyId
case orderBy
case isParty
case branchType
case effectBeginDateFrom
case effectBeginDateTo
case effectEndDateFrom
case effectEndDateTo
case departmentIds
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
title = try container.decodeIfPresent(String.self, forKey: .title)
typeId = try container.decodeIfPresent(Int.self, forKey: .typeId)
groupId = try container.decodeIfPresent(Int.self, forKey: .groupId)
subjectId = try container.decodeIfPresent(Int.self, forKey: .subjectId)
isUrgent = try container.decodeIfPresent(Bool.self, forKey: .isUrgent)
documentSearchStage = try container.decodeIfPresent(DocumentSearchStage.self, forKey: .documentSearchStage)
isInternal = try container.decodeIfPresent(Bool.self, forKey: .isInternal)
fromDate = try container.decodeIfPresent(Date.self, forKey: .fromDate)
toDate = try container.decodeIfPresent(Date.self, forKey: .toDate)
statusId = try container.decodeIfPresent(Int.self, forKey: .statusId)
issuingAgencyId = try container.decodeIfPresent(Int.self, forKey: .issuingAgencyId)
orderBy = try container.decodeIfPresent(SearchOrderBy.self, forKey: .orderBy)
isParty = try container.decodeIfPresent(Bool.self, forKey: .isParty)
branchType = try container.decodeIfPresent(Int16.self, forKey: .branchType)
effectBeginDateFrom = try container.decodeIfPresent(Date.self, forKey: .effectBeginDateFrom)
effectBeginDateTo = try container.decodeIfPresent(Date.self, forKey: .effectBeginDateTo)
effectEndDateFrom = try container.decodeIfPresent(Date.self, forKey: .effectEndDateFrom)
effectEndDateTo = try container.decodeIfPresent(Date.self, forKey: .effectEndDateTo)
departmentIds = try container.decodeIfPresent([Int].self, forKey: .departmentIds) ?? []
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if title != nil { try container.encode(title, forKey: .title) }
if typeId != nil { try container.encode(typeId, forKey: .typeId) }
if groupId != nil { try container.encode(groupId, forKey: .groupId) }
if subjectId != nil { try container.encode(subjectId, forKey: .subjectId) }
if isUrgent != nil { try container.encode(isUrgent, forKey: .isUrgent) }
if documentSearchStage != nil { try container.encode(documentSearchStage, forKey: .documentSearchStage) }
if isInternal != nil { try container.encode(isInternal, forKey: .isInternal) }
if fromDate != nil { try container.encode(fromDate, forKey: .fromDate) }
if toDate != nil { try container.encode(toDate, forKey: .toDate) }
if statusId != nil { try container.encode(statusId, forKey: .statusId) }
if issuingAgencyId != nil { try container.encode(issuingAgencyId, forKey: .issuingAgencyId) }
if orderBy != nil { try container.encode(orderBy, forKey: .orderBy) }
if isParty != nil { try container.encode(isParty, forKey: .isParty) }
if branchType != nil { try container.encode(branchType, forKey: .branchType) }
if effectBeginDateFrom != nil { try container.encode(effectBeginDateFrom, forKey: .effectBeginDateFrom) }
if effectBeginDateTo != nil { try container.encode(effectBeginDateTo, forKey: .effectBeginDateTo) }
if effectEndDateFrom != nil { try container.encode(effectEndDateFrom, forKey: .effectEndDateFrom) }
if effectEndDateTo != nil { try container.encode(effectEndDateTo, forKey: .effectEndDateTo) }
if departmentIds.count > 0 { try container.encode(departmentIds, forKey: .departmentIds) }
}
}
public class PagingRequest : Codable
{
public var page:Int
public var limit:Int
required public init(){}
}
public enum DocumentSearchStage : String, Codable
{
case All
case AllProcessing
case Draft
case PendingApproval
case IsRevisionRequested
case PendingCompilation
case PendingReport
case Published
case Active
case InActive
}
public enum SearchOrderBy : String, Codable
{
case UpdatedDateDesc
case PublishDateDesc
case TitleAsc
case DocumentCodeAsc
}
public class HttpResult : Codable
{
public var responseText:String
public var responseStream:Data
public var fileInfo:FileInfo
//virtualFile:IVirtualFile ignored. Swift doesn't support interface properties
public var contentType:String
public var headers:[String:String] = [:]
public var cookies:[Cookie] = []
public var eTag:String
@TimeSpan public var age:TimeInterval?
@TimeSpan public var maxAge:TimeInterval?
public var expires:Date?
public var lastModified:Date?
public var cacheControl:CacheControl
public var resultScope:Func<IDisposable>
public var allowsPartialResponse:Bool
public var options:[String:String] = [:]
public var status:Int
public var statusCode:HttpStatusCode
public var statusDescription:String
//response:Object ignored. Type could not be extended in Swift
//responseFilter:IContentTypeWriter ignored. Swift doesn't support interface properties
//requestContext:IRequest ignored. Swift doesn't support interface properties
public var view:String
public var template:String
public var paddingLength:Int
public var isPartialRequest:Bool
required public init(){}
}
public protocol IVirtualFile
{
//virtualPathProvider:IVirtualPathProvider ignored. Swift doesn't support interface properties
var `extension`:String { get set }
var length:Int { get set }
}
public protocol IVirtualPathProvider
{
//rootDirectory:IVirtualDirectory ignored. Swift doesn't support interface properties
var virtualPathSeparator:String { get set }
var realPathSeparator:String { get set }
}
public protocol IVirtualDirectory
{
}
// @Flags()
public enum CacheControl : Int, Codable
{
case None = 0
case Public = 1
case Private = 2
case MustRevalidate = 4
case NoCache = 8
case NoStore = 16
case NoTransform = 32
case ProxyRevalidate = 64
}
public protocol IContentTypeWriter
{
}
public protocol IRequest
{
//originalRequest:Object ignored. Type could not be extended in Swift
//response:IResponse ignored. Swift doesn't support interface properties
var operationName:String { get set }
var verb:String { get set }
var requestAttributes:RequestAttributes { get set }
//requestPreferences:IRequestPreferences ignored. Swift doesn't support interface properties
//dto:Object ignored. Type could not be extended in Swift
var contentType:String { get set }
var isLocal:Bool { get set }
var userAgent:String { get set }
var cookies:[String:Cookie] { get set }
var responseContentType:String { get set }
var hasExplicitResponseContentType:Bool { get set }
var items:[String:Object] { get set }
var headers:NameValueCollection { get set }
var queryString:NameValueCollection { get set }
var formData:NameValueCollection { get set }
var useBufferedStream:Bool { get set }
var rawUrl:String { get set }
var absoluteUri:String { get set }
var userHostAddress:String { get set }
var remoteIp:String { get set }
var authorization:String { get set }
var isSecureConnection:Bool { get set }
var acceptTypes:[String] { get set }
var pathInfo:String { get set }
var originalPathInfo:String { get set }
var inputStream:Data { get set }
var contentLength:Int { get set }
var files:[IHttpFile] { get set }
var urlReferrer:Uri { get set }
}
public protocol IResponse
{
//originalResponse:Object ignored. Type could not be extended in Swift
//request:IRequest ignored. Swift doesn't support interface properties
var statusCode:Int { get set }
var statusDescription:String { get set }
var contentType:String { get set }
var outputStream:Data { get set }
//dto:Object ignored. Type could not be extended in Swift
var useBufferedStream:Bool { get set }
var isClosed:Bool { get set }
var keepAlive:Bool { get set }
var hasStarted:Bool { get set }
var items:[String:Object] { get set }
}
// @Flags()
public enum RequestAttributes : Int, Codable
{
case None = 0
case Localhost = 1
case LocalSubnet = 2
case External = 4
case Secure = 8
case InSecure = 16
case AnySecurityMode = 24
case HttpHead = 32
case HttpGet = 64
case HttpPost = 128
case HttpPut = 256
case HttpDelete = 512
case HttpPatch = 1024
case HttpOptions = 2048
case HttpOther = 4096
case AnyHttpMethod = 8160
case OneWay = 8192
case Reply = 16384
case AnyCallStyle = 24576
case Soap11 = 32768
case Soap12 = 65536
case Xml = 131072
case Json = 262144
case Jsv = 524288
case ProtoBuf = 1048576
case Csv = 2097152
case Html = 4194304
case Wire = 8388608
case MsgPack = 16777216
case FormatOther = 33554432
case AnyFormat = 67076096
case Http = 67108864
case MessageQueue = 134217728
case Tcp = 268435456
case Grpc = 536870912
case EndpointOther = 1073741824
case AnyEndpoint = 2080374784
case InProcess = -2147483648
case InternalNetworkAccess = -2147483645
case AnyNetworkAccessType = -2147483641
case Any = -1
}
public protocol IRequestPreferences
{
var acceptsBrotli:Bool { get set }
var acceptsDeflate:Bool { get set }
var acceptsGzip:Bool { get set }
}
public protocol IHttpFile
{
var name:String { get set }
var fileName:String { get set }
var contentLength:Int { get set }
var contentType:String { get set }
var inputStream:Data { get set }
}
To override the Content-type in your clients, use the HTTP Accept Header, append the .xml suffix or ?format=xml
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /report/bm05/preview HTTP/1.1
Host: etc-api.vsmlab.vn
Accept: application/xml
Content-Type: application/xml
Content-Length: length
<PreviewBM05Report xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/tvpl.api.ServiceModel">
<Limit>10</Limit>
<Page>1</Page>
<BranchType>0</BranchType>
<DepartmentIds xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d2p1:int>0</d2p1:int>
</DepartmentIds>
<DocumentSearchStage>All</DocumentSearchStage>
<EffectBeginDateFrom>0001-01-01T00:00:00</EffectBeginDateFrom>
<EffectBeginDateTo>0001-01-01T00:00:00</EffectBeginDateTo>
<EffectEndDateFrom>0001-01-01T00:00:00</EffectEndDateFrom>
<EffectEndDateTo>0001-01-01T00:00:00</EffectEndDateTo>
<FromDate>0001-01-01T00:00:00</FromDate>
<GroupId>0</GroupId>
<IsInternal>false</IsInternal>
<IsParty>false</IsParty>
<IsUrgent>false</IsUrgent>
<IssuingAgencyId>0</IssuingAgencyId>
<OrderBy>UpdatedDateDesc</OrderBy>
<StatusId>0</StatusId>
<SubjectId>0</SubjectId>
<Title>String</Title>
<ToDate>0001-01-01T00:00:00</ToDate>
<TypeId>0</TypeId>
</PreviewBM05Report>
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: length <CustomHttpResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.servicestack.net/types" />