作者 yangfu

生产制造 - 商品导入导出

  1 +package query
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain"
  4 +
  5 +type SearchProductQuery struct {
  6 + // 产品名称
  7 + ProductName string `json:"productName,omitempty"`
  8 + // 产品类别
  9 + ProductCategory string `cname:"产品类别" json:"productCategory"`
  10 + //操作人
  11 + Operator domain.Operator `json:"-"`
  12 + SelectedField []string `json:"selectedField"`
  13 +}
@@ -2,6 +2,7 @@ package service @@ -2,6 +2,7 @@ package service
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_manufacture"
5 6
6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/application/web/excelData/query" 7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/application/web/excelData/query"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain"
@@ -51,3 +52,16 @@ func (srv ExcelDataService) ExportCooperationUser(companyUserListQuery *query.Co @@ -51,3 +52,16 @@ func (srv ExcelDataService) ExportCooperationUser(companyUserListQuery *query.Co
51 } 52 }
52 return ExportCooperationUserData{SourceData: result.Users, SelectedField: companyUserListQuery.SelectedField}, nil 53 return ExportCooperationUserData{SourceData: result.Users, SelectedField: companyUserListQuery.SelectedField}, nil
53 } 54 }
  55 +
  56 +// ExportCooperationUser 导出共创用户信息列表
  57 +func (srv ExcelDataService) ExportProducts(cmd *query.SearchProductQuery) (ExportProductsData, error) {
  58 + creationUserGateway := allied_creation_manufacture.NewHttpLibAlliedCreationManufacture(cmd.Operator)
  59 + result, err := creationUserGateway.SearchProduct(allied_creation_manufacture.SearchProductRequest{
  60 + ProductName: cmd.ProductName,
  61 + ProductCategory: cmd.ProductCategory,
  62 + })
  63 + if err != nil {
  64 + return ExportProductsData{}, fmt.Errorf("获取企业用户数据失败:%w", err)
  65 + }
  66 + return ExportProductsData{SourceData: result.Grid.List, SelectedField: cmd.SelectedField}, nil
  67 +}
@@ -2,6 +2,7 @@ package service @@ -2,6 +2,7 @@ package service
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_manufacture"
5 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/util/converter" 6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/util/converter"
6 "strings" 7 "strings"
7 8
@@ -161,6 +162,43 @@ func (srv ExcelDataService) ImportOrganization(importDataCommand *command.Import @@ -161,6 +162,43 @@ func (srv ExcelDataService) ImportOrganization(importDataCommand *command.Import
161 return srv.importResultWithHeader(excelImport.DataFields, result.FailRows, len(items)), nil 162 return srv.importResultWithHeader(excelImport.DataFields, result.FailRows, len(items)), nil
162 } 163 }
163 164
  165 +// ImportProduct 导入生产信息
  166 +func (srv ExcelDataService) ImportProduct(importDataCommand *command.ImportDataCommand) (interface{}, error) {
  167 + excelImport := excel.NewExcelImport()
  168 + excelImport.RowBegin = 3 //第二行开始读取
  169 + excelImport.DataFields = []excel.DataField{
  170 + {EnName: "productCode", CnName: "产品编号"},
  171 + {EnName: "productName", CnName: "*品名"},
  172 + {EnName: "unit", CnName: "*规格"},
  173 + {EnName: "productCategory", CnName: "*类别"},
  174 + {EnName: "unitWeight", CnName: "投入单份重量"},
  175 + }
  176 + excelData, err := converter.OpenImportFileFromIoReader(excelImport, importDataCommand.Reader, importDataCommand.FileExt) //excelImport.OpenExcelFromIoReader(importDataCommand.Reader)
  177 + if err != nil {
  178 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  179 + }
  180 + items := make([]*domain.ImportProductItem, 0)
  181 + for _, v := range excelData {
  182 + item := &domain.ImportProductItem{
  183 + ProductCode: strings.TrimSpace(v["productCode"]),
  184 + ProductName: strings.TrimSpace(v["productName"]),
  185 + ProductCategory: strings.TrimSpace(v["productCategory"]),
  186 + Unit: strings.TrimSpace(v["unit"]),
  187 + UnitWeight: strings.TrimSpace(v["unitWeight"]),
  188 + }
  189 + items = append(items, item)
  190 + }
  191 +
  192 + svr := allied_creation_manufacture.NewHttpLibAlliedCreationManufacture(importDataCommand.Operator)
  193 + result, err := svr.BatchAddProduct(allied_creation_manufacture.BatchAddProductRequest{
  194 + List: items,
  195 + })
  196 + if err != nil {
  197 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  198 + }
  199 + return srv.importResultWithHeader(excelImport.DataFields, *result, len(items)), nil
  200 +}
  201 +
164 // 导入结果 202 // 导入结果
165 func (srv ExcelDataService) importResultWithHeader(headers []excel.DataField, failRows []interface{}, totalRow int) interface{} { 203 func (srv ExcelDataService) importResultWithHeader(headers []excel.DataField, failRows []interface{}, totalRow int) interface{} {
166 var result = map[string]interface{}{ 204 var result = map[string]interface{}{
1 package service 1 package service
2 2
3 import ( 3 import (
  4 + "fmt"
4 "github.com/linmadan/egglib-go/utils/excel" 5 "github.com/linmadan/egglib-go/utils/excel"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_manufacture"
5 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_user" 7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_user"
6 ) 8 )
7 9
@@ -175,3 +177,65 @@ func (data ExportCooperationUserData) DataListLen() int { @@ -175,3 +177,65 @@ func (data ExportCooperationUserData) DataListLen() int {
175 func (data ExportCooperationUserData) TableTitle() []string { 177 func (data ExportCooperationUserData) TableTitle() []string {
176 return nil 178 return nil
177 } 179 }
  180 +
  181 +//ExportProductsData 导出产品数据
  182 +type ExportProductsData struct {
  183 + SourceData []allied_creation_manufacture.SearchProductItem
  184 + SelectedField []string
  185 +}
  186 +
  187 +var _ excel.ExcelMaker = (*ExportProductsData)(nil)
  188 +
  189 +func (data ExportProductsData) AllFields() []DataFieldOptions {
  190 + return []DataFieldOptions{
  191 + {EnName: "productCode", CnName: "产品编号"},
  192 + {EnName: "productName", CnName: "*品名"},
  193 + {EnName: "unit", CnName: "*规格"},
  194 + {EnName: "productCategory", CnName: "*类别"},
  195 + {EnName: "unitWeight", CnName: "投入单份重量"},
  196 + }
  197 +}
  198 +
  199 +func (data ExportProductsData) DataFieldList() []excel.DataField {
  200 + fields := []excel.DataField{}
  201 + allFields := data.AllFields()
  202 + for _, value2 := range allFields {
  203 + if len(data.SelectedField) == 0 || value2.IsDefault {
  204 + fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  205 + continue
  206 + }
  207 + for _, value3 := range data.SelectedField {
  208 + if value2.EnName == value3 {
  209 + fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  210 + }
  211 + }
  212 + }
  213 + return fields
  214 +}
  215 +
  216 +func (data ExportProductsData) CellValue(index int, enName string) (value interface{}) {
  217 + if index > data.DataListLen() {
  218 + return ""
  219 + }
  220 + switch enName {
  221 + case "productCode":
  222 + return data.SourceData[index].ProductCode
  223 + case "productName":
  224 + return data.SourceData[index].ProductName
  225 + case "unit":
  226 + return data.SourceData[index].Unit
  227 + case "productCategory":
  228 + return data.SourceData[index].ProductCategory
  229 + case "unitWeight":
  230 + return fmt.Sprintf("%v", data.SourceData[index].UnitWeight)
  231 + }
  232 + return nil
  233 +}
  234 +
  235 +func (data ExportProductsData) DataListLen() int {
  236 + return len(data.SourceData)
  237 +}
  238 +
  239 +func (data ExportProductsData) TableTitle() []string {
  240 + return nil
  241 +}
@@ -27,6 +27,9 @@ var ALLIED_CREATION_USER_HOST = "http://localhost:8081" //"http://allied-creatio @@ -27,6 +27,9 @@ var ALLIED_CREATION_USER_HOST = "http://localhost:8081" //"http://allied-creatio
27 //天联共创业务模块 27 //天联共创业务模块
28 var ALLIED_CREATION_COOPERATION_HOST = "http://localhost:8082" // "http://allied-creation-cooperation-dev.fjmaimaimai.com" 28 var ALLIED_CREATION_COOPERATION_HOST = "http://localhost:8082" // "http://allied-creation-cooperation-dev.fjmaimaimai.com"
29 29
  30 +// 天联共创 生产制造模块
  31 +var ALLIED_CREATION_MANUFACTURE_HOST = "http://localhost:8083"
  32 +
30 // 版本更新模块 33 // 版本更新模块
31 var SUPLUS_ADMIN_BASE_HOST = "http://suplus-admin-base-dev.fjmaimaimai.com" 34 var SUPLUS_ADMIN_BASE_HOST = "http://suplus-admin-base-dev.fjmaimaimai.com"
32 35
@@ -63,6 +63,9 @@ const ( @@ -63,6 +63,9 @@ const (
63 ImportDividendsOrders = "BUSINESS_ALLIED-CREATION_BONUS_ORDER" 63 ImportDividendsOrders = "BUSINESS_ALLIED-CREATION_BONUS_ORDER"
64 // 导入退货订单 64 // 导入退货订单
65 ImportDividendsReturnOrders = "BUSINESS_ALLIED-CREATION_BONUS_RETURN" 65 ImportDividendsReturnOrders = "BUSINESS_ALLIED-CREATION_BONUS_RETURN"
  66 +
  67 + // 导入产品
  68 + ImportProducts = "ImportProducts"
66 ) 69 )
67 70
68 const ( 71 const (
@@ -70,6 +73,9 @@ const ( @@ -70,6 +73,9 @@ const (
70 ExportCompanyUser = "ExportCompanyUser" 73 ExportCompanyUser = "ExportCompanyUser"
71 // 导入共创用户 74 // 导入共创用户
72 ExportCooperationUser = "ExportCooperationUser" 75 ExportCooperationUser = "ExportCooperationUser"
  76 +
  77 + // 导入产品
  78 + ExportProducts = "ExportProducts"
73 ) 79 )
74 80
75 const ( 81 const (
  1 +package domain
  2 +
  3 +// 导入数据体
  4 +type ImportProductItem struct {
  5 + // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001
  6 + ProductCode string `json:"productCode,omitempty"`
  7 + // 产品名称
  8 + ProductName string `json:"productName,omitempty"`
  9 + // 产品类别
  10 + ProductCategory string `json:"productCategory,omitempty"`
  11 + // 单位
  12 + Unit string `json:"unit,omitempty"`
  13 + // 单份重量(原材料)
  14 + UnitWeight string `json:"unitWeight,omitempty"`
  15 + // 失败理由
  16 + FailReason string `json:"failReason"`
  17 +}
  1 +package allied_creation_manufacture
  2 +
  3 +import (
  4 + "fmt"
  5 + "time"
  6 +
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/constant"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway"
  10 +)
  11 +
  12 +//HttpLibAlliedCreationManufacture 生产制造模块
  13 +type HttpLibAlliedCreationManufacture struct {
  14 + service_gateway.BaseServiceGateway
  15 + baseUrL string
  16 +}
  17 +
  18 +func NewHttpLibAlliedCreationManufacture(operator domain.Operator) *HttpLibAlliedCreationManufacture {
  19 + return &HttpLibAlliedCreationManufacture{
  20 + BaseServiceGateway: service_gateway.BaseServiceGateway{
  21 + ConnectTimeout: 100 * time.Second,
  22 + ReadWriteTimeout: 100 * time.Second,
  23 + CompanyId: operator.CompanyId,
  24 + OrgId: operator.OrgId,
  25 + UserId: operator.UserId,
  26 + UserBaseId: operator.UserBaseId,
  27 + },
  28 + baseUrL: constant.ALLIED_CREATION_MANUFACTURE_HOST,
  29 + }
  30 +
  31 +}
  32 +
  33 +func (gateway HttpLibAlliedCreationManufacture) BaseUrl() string {
  34 + return gateway.baseUrL
  35 +}
  36 +
  37 +//BatchAddProduct 批量添加产品
  38 +func (gateway HttpLibAlliedCreationManufacture) BatchAddProduct(param BatchAddProductRequest) (*BatchAddProductResponse, error) {
  39 + url := fmt.Sprintf("%s%s", gateway.BaseUrl(), "/products/batch-add")
  40 + method := "post"
  41 + var data BatchAddProductResponse
  42 + err := gateway.FastDoRequest(url, method, param, &data)
  43 + return &data, err
  44 +}
  45 +
  46 +type BatchAddProductRequest struct {
  47 + List []*domain.ImportProductItem `json:"list"`
  48 +}
  49 +type BatchAddProductResponse []interface{}
  50 +
  51 +//BatchAddProduct 批量添加产品
  52 +func (gateway HttpLibAlliedCreationManufacture) SearchProduct(param SearchProductRequest) (*SearchProductResponse, error) {
  53 + url := fmt.Sprintf("%s%s", gateway.BaseUrl(), "/products/search")
  54 + method := "post"
  55 + var data SearchProductResponse
  56 + err := gateway.FastDoRequest(url, method, param, &data)
  57 + return &data, err
  58 +}
  59 +
  60 +type (
  61 + SearchProductRequest struct {
  62 + // 页码
  63 + PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  64 + // 页数
  65 + PageSize int `cname:"页数" json:"pageSize,omitempty"`
  66 + // 产品名称
  67 + ProductName string `json:"productName,omitempty"`
  68 + // 产品类别
  69 + ProductCategory string `cname:"产品类别" json:"productCategory"`
  70 + }
  71 + SearchProductResponse struct {
  72 + Grid struct {
  73 + List []SearchProductItem `json:"list"`
  74 + Total int `json:"total"`
  75 + } `json:"grid"`
  76 + }
  77 + SearchProductItem struct {
  78 + ProductID int `json:"productId"`
  79 + ProductCode string `json:"productCode"`
  80 + ProductName string `json:"productName"`
  81 + ProductCategory string `json:"productCategory"`
  82 + Unit string `json:"unit"`
  83 + UnitWeight float64 `json:"unitWeight"`
  84 + }
  85 +)
@@ -66,3 +66,40 @@ func (gateway BaseServiceGateway) GetResponseData(result GatewayResponse, data i @@ -66,3 +66,40 @@ func (gateway BaseServiceGateway) GetResponseData(result GatewayResponse, data i
66 } 66 }
67 return nil 67 return nil
68 } 68 }
  69 +
  70 +func (gateway BaseServiceGateway) FastDoRequest(url, method string, param interface{}, data interface{}) error {
  71 + err := gateway.DoRequest(Request{
  72 + Url: url,
  73 + Method: method,
  74 + Param: param,
  75 + }, &data)
  76 + if err != nil {
  77 + return err
  78 + }
  79 + return nil
  80 +}
  81 +
  82 +func (gateway BaseServiceGateway) DoRequest(requestParam Request, val interface{}) error {
  83 + r := gateway.CreateRequest(requestParam.Url, requestParam.Method)
  84 + req, err := r.JSONBody(requestParam.Param)
  85 + if err != nil {
  86 + return err
  87 + }
  88 + byteResult, err := req.Bytes()
  89 + if err != nil {
  90 + return err
  91 + }
  92 + var result GatewayResponse
  93 + err = json.Unmarshal(byteResult, &result)
  94 + if err != nil {
  95 + return err
  96 + }
  97 + err = gateway.GetResponseData(result, val)
  98 + return nil
  99 +}
  100 +
  101 +type Request struct {
  102 + Url string
  103 + Method string
  104 + Param interface{}
  105 +}
@@ -2,6 +2,7 @@ package beego @@ -2,6 +2,7 @@ package beego
2 2
3 import ( 3 import (
4 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain" 4 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_manufacture"
5 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_user" 6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_user"
6 "net/http" 7 "net/http"
7 "os" 8 "os"
@@ -63,6 +64,9 @@ func init() { @@ -63,6 +64,9 @@ func init() {
63 //)) 64 //))
64 65
65 web.InsertFilter("/v1/common/user/area/*", web.BeforeRouter, middleware.RedirectInternalService("/v1/common/user", allied_creation_user.NewHttplibAlliedCreationUser(domain.Operator{}))) 66 web.InsertFilter("/v1/common/user/area/*", web.BeforeRouter, middleware.RedirectInternalService("/v1/common/user", allied_creation_user.NewHttplibAlliedCreationUser(domain.Operator{})))
  67 +
  68 + web.InsertFilter("/v1/manufacture/*", web.BeforeRouter, middleware.CheckAccessToken())
  69 + web.InsertFilter("/v1/manufacture/*", web.BeforeRouter, middleware.RedirectInternalService("/v1/manufacture", allied_creation_manufacture.NewHttpLibAlliedCreationManufacture(domain.Operator{})))
66 } 70 }
67 71
68 func AllowCors() func(ctx *context.Context) { 72 func AllowCors() func(ctx *context.Context) {
@@ -209,6 +209,8 @@ func defaultImport(controller *ExcelDataController) { @@ -209,6 +209,8 @@ func defaultImport(controller *ExcelDataController) {
209 data, err = excelService.ImportCooperationUser(cmd) 209 data, err = excelService.ImportCooperationUser(cmd)
210 case domain.ImportOrganization: 210 case domain.ImportOrganization:
211 data, err = excelService.ImportOrganization(cmd) 211 data, err = excelService.ImportOrganization(cmd)
  212 + case domain.ImportProducts:
  213 + data, err = excelService.ImportProduct(cmd)
212 default: 214 default:
213 err = fmt.Errorf("导入不存在 Code:%v", cmd.Code) 215 err = fmt.Errorf("导入不存在 Code:%v", cmd.Code)
214 } 216 }
@@ -261,6 +263,12 @@ func fileExport(controller *ExcelDataController, code string) { @@ -261,6 +263,12 @@ func fileExport(controller *ExcelDataController, code string) {
261 companyUserListQuery.Operator = exportDataCommand.Operator 263 companyUserListQuery.Operator = exportDataCommand.Operator
262 data, err = excelService.ExportCooperationUser(companyUserListQuery) 264 data, err = excelService.ExportCooperationUser(companyUserListQuery)
263 filename = "导出共创用户" 265 filename = "导出共创用户"
  266 + case domain.ExportProducts:
  267 + companyUserListQuery := &query.SearchProductQuery{}
  268 + exportDataCommand.UnmarshalQuery(companyUserListQuery)
  269 + companyUserListQuery.Operator = exportDataCommand.Operator
  270 + data, err = excelService.ExportProducts(companyUserListQuery)
  271 + filename = "导出商品"
264 default: 272 default:
265 err = fmt.Errorf("export type :%v not exists", exportDataCommand.Code) 273 err = fmt.Errorf("export type :%v not exists", exportDataCommand.Code)
266 } 274 }
@@ -14,8 +14,8 @@ type CtxKeyLoginToken struct{} @@ -14,8 +14,8 @@ type CtxKeyLoginToken struct{}
14 14
15 func FormCtxLoginToken(ctx *context.Context) (domain.LoginToken, bool) { 15 func FormCtxLoginToken(ctx *context.Context) (domain.LoginToken, bool) {
16 val := ctx.Input.GetData(CtxKeyLoginToken{}) 16 val := ctx.Input.GetData(CtxKeyLoginToken{})
17 - if v, ok := val.(domain.LoginToken); ok {  
18 - return v, true 17 + if v, ok := val.(*domain.LoginToken); ok {
  18 + return *v, true
19 } 19 }
20 return domain.LoginToken{}, false 20 return domain.LoginToken{}, false
21 } 21 }
@@ -34,19 +34,19 @@ func RedirectInternalService(prefix string, svr internalService) web.FilterFunc @@ -34,19 +34,19 @@ func RedirectInternalService(prefix string, svr internalService) web.FilterFunc
34 "code": 1, 34 "code": 1,
35 "data": struct{}{}, 35 "data": struct{}{},
36 }, false, false) 36 }, false, false)
37 - } else {  
38 - ctx.Output.SetStatus(http.StatusOK)  
39 - ctx.Output.JSON(map[string]interface{}{  
40 - "msg": "成功",  
41 - "code": 0,  
42 - "data": data,  
43 - }, false, false)  
44 } 37 }
45 }() 38 }()
46 -  
47 method := strings.ToLower(ctx.Request.Method) 39 method := strings.ToLower(ctx.Request.Method)
48 url := strings.Replace(ctx.Request.RequestURI, prefix, "", 1) 40 url := strings.Replace(ctx.Request.RequestURI, prefix, "", 1)
49 req := svr.CreateRequest(svr.BaseUrl()+url, method) 41 req := svr.CreateRequest(svr.BaseUrl()+url, method)
  42 +
  43 + // 传递当前登录信息(可配置)
  44 + loginToken, ok := FormCtxLoginToken(ctx)
  45 + if ok && loginToken.CompanyId > 0 && loginToken.OrgId > 0 {
  46 + req.Header("companyId", fmt.Sprintf("%v", loginToken.CompanyId))
  47 + req.Header("orgId", fmt.Sprintf("%v", loginToken.OrgId))
  48 + }
  49 +
50 req.Body(ctx.Input.RequestBody) 50 req.Body(ctx.Input.RequestBody)
51 response, err := req.Response() 51 response, err := req.Response()
52 if err != nil { 52 if err != nil {
@@ -63,6 +63,13 @@ func RedirectInternalService(prefix string, svr internalService) web.FilterFunc @@ -63,6 +63,13 @@ func RedirectInternalService(prefix string, svr internalService) web.FilterFunc
63 } 63 }
64 defer response.Body.Close() 64 defer response.Body.Close()
65 65
  66 + // 透传非json数据
  67 + contentType := response.Header.Get("Content-Type")
  68 + if contentType != "application/json" {
  69 + copyResponse(ctx, response, byteResult)
  70 + return
  71 + }
  72 +
66 var result service_gateway.GatewayResponse 73 var result service_gateway.GatewayResponse
67 err = json.Unmarshal(byteResult, &result) 74 err = json.Unmarshal(byteResult, &result)
68 if err != nil { 75 if err != nil {
@@ -70,5 +77,25 @@ func RedirectInternalService(prefix string, svr internalService) web.FilterFunc @@ -70,5 +77,25 @@ func RedirectInternalService(prefix string, svr internalService) web.FilterFunc
70 } 77 }
71 78
72 err = svr.GetResponseData(result, &data) 79 err = svr.GetResponseData(result, &data)
  80 + if err != nil {
  81 + return
  82 + }
  83 + ctx.Output.SetStatus(http.StatusOK)
  84 + ctx.Output.JSON(map[string]interface{}{
  85 + "msg": "成功",
  86 + "code": 0,
  87 + "data": data,
  88 + }, false, false)
  89 + }
  90 +}
  91 +
  92 +func copyResponse(ctx *context.Context, response *http.Response, data []byte) {
  93 + for k, v := range response.Header {
  94 + if len(v) == 0 {
  95 + continue
  96 + }
  97 + ctx.Output.Header(k, strings.Join(v, ","))
73 } 98 }
  99 + ctx.Output.SetStatus(response.StatusCode)
  100 + ctx.Output.Body(data)
74 } 101 }