| | |
| | | package v1 |
| | | |
| | | import ( |
| | | "aps_crm/conf" |
| | | "aps_crm/constvar" |
| | | "aps_crm/model" |
| | | "aps_crm/model/grpc_init" |
| | | "aps_crm/model/request" |
| | | "aps_crm/model/response" |
| | | "aps_crm/pkg/contextx" |
| | | "aps_crm/pkg/ecode" |
| | | "aps_crm/pkg/logx" |
| | | "aps_crm/pkg/structx" |
| | | "aps_crm/proto/crm_aps" |
| | | "aps_crm/proto/product_inventory" |
| | | "aps_crm/utils" |
| | | "github.com/gin-gonic/gin" |
| | | "github.com/shopspring/decimal" |
| | | "google.golang.org/grpc" |
| | | "google.golang.org/grpc/credentials/insecure" |
| | | "strconv" |
| | | ) |
| | | |
| | |
| | | // @Summary 添加销售明细 |
| | | // @Produce application/json |
| | | // @Param object body request.AddSalesDetails true "查询参数" |
| | | // @Success 200 {object} contextx.Response{} |
| | | // @Success 200 {object} contextx.Response{data=request.AddSalesDetails} |
| | | // @Router /api/salesDetails/add [post] |
| | | func (s *SalesDetailsApi) Add(c *gin.Context) { |
| | | var params request.AddSalesDetails |
| | |
| | | return |
| | | } |
| | | |
| | | count, err := model.NewSalesDetailsSearch().SetNumber(params.Number).Count() |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "编码验证失败") |
| | | return |
| | | } |
| | | if count > 0 { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "编码已存在") |
| | | return |
| | | } |
| | | |
| | | if salesDetails.MemberId == 0 { |
| | | userInfo := utils.GetUserInfo(c) |
| | | if userInfo.UserType == constvar.UserTypeSub { |
| | | salesDetails.MemberId = userInfo.CrmUserId |
| | | } |
| | | } |
| | | |
| | | errCode = salesDetailsService.AddSalesDetails(&salesDetails) |
| | | if errCode != ecode.OK { |
| | | ctx.Fail(errCode) |
| | | return |
| | | } |
| | | |
| | | ctx.Ok() |
| | | ctx.OkWithDetailed(salesDetails) |
| | | } |
| | | |
| | | // Delete |
| | |
| | | |
| | | id, _ := strconv.Atoi(c.Param("id")) |
| | | errCode := salesDetailsService.DeleteSalesDetails(id) |
| | | if errCode != ecode.OK { |
| | | ctx.Fail(errCode) |
| | | return |
| | | } |
| | | |
| | | ctx.Ok() |
| | | } |
| | | |
| | | // BatchDelete |
| | | // @Tags SalesDetails 销售明细 |
| | | // @Summary 批量删除销售明细 |
| | | // @Produce application/json |
| | | // @Param object body request.CommonIds true "参数" |
| | | // @Success 200 {object} contextx.Response{} |
| | | // @Router /api/salesDetails/delete [delete] |
| | | func (s *SalesDetailsApi) BatchDelete(c *gin.Context) { |
| | | var params request.CommonIds |
| | | ctx, ok := contextx.NewContext(c, ¶ms) |
| | | if !ok { |
| | | return |
| | | } |
| | | |
| | | errCode := salesDetailsService.BatchDeleteSalesDetails(params.Ids) |
| | | if errCode != ecode.OK { |
| | | ctx.Fail(errCode) |
| | | return |
| | |
| | | ctx.Ok() |
| | | } |
| | | |
| | | // List |
| | | // |
| | | // @Tags SalesDetails |
| | | // @Summary 获取销售明细列表 |
| | | // @Produce application/json |
| | | // @Success 200 {object} contextx.Response{data=response.SalesDetailsResponse} |
| | | // @Router /api/salesDetails/list [get] |
| | | func (s *SalesDetailsApi) List(c *gin.Context) { |
| | | ctx, ok := contextx.NewContext(c, nil) |
| | | if !ok { |
| | | return |
| | | } |
| | | |
| | | list, errCode := salesDetailsService.GetSalesDetailsList() |
| | | if errCode != ecode.OK { |
| | | ctx.Fail(errCode) |
| | | return |
| | | } |
| | | |
| | | ctx.OkWithDetailed(response.SalesDetailsResponse{ |
| | | List: list, |
| | | }) |
| | | } |
| | | |
| | | func checkSalesDetailsParams(salesDetails request.SalesDetails) (errCode int, salesDetailsModel model.SalesDetails) { |
| | | //if salesDetails.ClientId == 0 { |
| | | // return ecode.InvalidParams, salesDetailsModel |
| | | //} |
| | | // |
| | | //if salesDetails.Number == "" { |
| | | // return ecode.InvalidParams, salesDetailsModel |
| | | //} |
| | | // |
| | | //if salesDetails.MemberId == 0 { |
| | | // return ecode.InvalidParams, salesDetailsModel |
| | | //} |
| | | // |
| | | //if salesDetails.SignTime == "" { |
| | | // return ecode.InvalidParams, salesDetailsModel |
| | | //} |
| | | |
| | | t, err := checkTimeFormat(salesDetails.SignTime) |
| | | if err != nil { |
| | | return ecode.InvalidParams, salesDetailsModel |
| | | } |
| | | |
| | | t, err = checkTimeFormat(salesDetails.DeliveryDate) |
| | | if err != nil { |
| | | return ecode.InvalidParams, salesDetailsModel |
| | | } |
| | | |
| | | salesDetailsModel.ClientId = salesDetails.ClientId |
| | | salesDetailsModel.Number = salesDetails.Number |
| | | salesDetailsModel.SaleChanceId = salesDetails.SaleChanceId |
| | | salesDetailsModel.SaleType = salesDetails.SaleType |
| | | salesDetailsModel.SignTime = t |
| | | salesDetailsModel.SignTime = salesDetails.SignTime |
| | | salesDetailsModel.MemberId = salesDetails.MemberId |
| | | salesDetailsModel.DeliveryDate = t |
| | | salesDetailsModel.WechatOrderStatus = salesDetails.WechatOrderStatus |
| | | salesDetailsModel.DeliveryDate = salesDetails.DeliveryDate |
| | | salesDetailsModel.WechatOrderStatusId = salesDetails.WechatOrderStatusId |
| | | salesDetailsModel.Address = salesDetails.Address |
| | | salesDetailsModel.Phone = salesDetails.Phone |
| | | salesDetailsModel.Remark = salesDetails.Remark |
| | |
| | | salesDetailsModel.LogisticCompany = salesDetails.LogisticCompany |
| | | salesDetailsModel.LogisticNumber = salesDetails.LogisticNumber |
| | | salesDetailsModel.LogisticCost = salesDetails.LogisticCost |
| | | salesDetailsModel.CodeStandID = salesDetails.CodeStandID |
| | | salesDetailsModel.DeliverType = salesDetails.DeliverType |
| | | salesDetailsModel.QuotationId = salesDetails.QuotationId |
| | | salesDetailsModel.Status = salesDetails.Status |
| | | salesDetailsModel.Source = salesDetails.Source |
| | | |
| | | return ecode.OK, salesDetailsModel |
| | | } |
| | | |
| | | // List |
| | | // |
| | | // @Tags SalesDetails |
| | | // @Summary 销售明细单列表 |
| | | // @Produce application/json |
| | | // @Param object body request.GetSalesDetailsList true "参数" |
| | | // @Success 200 {object} contextx.Response{data=response.SalesDetailsResponse} |
| | | // @Router /api/salesDetails/list [post] |
| | | func (con *SalesDetailsApi) List(c *gin.Context) { |
| | | var params request.GetSalesDetailsList |
| | | ctx, ok := contextx.NewContext(c, ¶ms) |
| | | if !ok { |
| | | return |
| | | } |
| | | |
| | | var memberIds []int |
| | | userInfo := utils.GetUserInfo(c) |
| | | if userInfo.UserType == constvar.UserTypeSub { |
| | | memberIds = userInfo.SubUserIds |
| | | } |
| | | |
| | | salesDetailss, total, errCode := salesDetailsService.GetSalesDetailsList(params, memberIds) |
| | | if errCode != ecode.OK { |
| | | ctx.Fail(errCode) |
| | | return |
| | | } |
| | | |
| | | ctx.OkWithDetailed(response.SalesDetailsResponse{ |
| | | List: salesDetailss, |
| | | Count: int(total), |
| | | }) |
| | | } |
| | | |
| | | // UpdateStatus |
| | | // |
| | | // @Tags SalesDetails |
| | | // @Summary 更新销售明细状态 |
| | | // @Produce application/json |
| | | // @Param object body request.UpdateSalesDetailsStatus true "查询参数" |
| | | // @Success 200 {object} contextx.Response{} |
| | | // @Router /api/salesDetails/updateStatus [post] |
| | | func (s *SalesDetailsApi) UpdateStatus(c *gin.Context) { |
| | | var params request.UpdateSalesDetailsStatus |
| | | ctx, ok := contextx.NewContext(c, ¶ms) |
| | | if !ok { |
| | | return |
| | | } |
| | | |
| | | m := make(map[string]interface{}) |
| | | m["status"] = params.Status |
| | | err := model.NewSalesDetailsSearch().SetId(params.Id).UpdateByMap(m) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "更新失败") |
| | | return |
| | | } |
| | | |
| | | ctx.Ok() |
| | | } |
| | | |
| | | var ( |
| | | ProductInventoryServiceConn *grpc.ClientConn |
| | | ) |
| | | |
| | | func InitProductInventoryServiceConn() { |
| | | var err error |
| | | ProductInventoryServiceConn, err = grpc.Dial(conf.Conf.GrpcServiceAddr.WMS, grpc.WithTransportCredentials(insecure.NewCredentials())) |
| | | if err != nil { |
| | | logx.Errorf("grpc dial product service error: %v", err.Error()) |
| | | return |
| | | } |
| | | } |
| | | |
| | | func CloseProductInventoryServiceConn() { |
| | | if ProductInventoryServiceConn != nil { |
| | | ProductInventoryServiceConn.Close() |
| | | } |
| | | } |
| | | |
| | | // GetProductInventoryInfo |
| | | // |
| | | // @Tags SalesDetails |
| | | // @Summary 获取产品库存信息 |
| | | // @Produce application/json |
| | | // @Param number path string true "明细编码" |
| | | // @Success 200 {object} response.ListResponse |
| | | // |
| | | // @Router /api/salesDetails/getProductInventoryInfo/{number} [get] |
| | | func (s *SalesDetailsApi) GetProductInventoryInfo(c *gin.Context) { |
| | | ctx, ok := contextx.NewContext(c, nil) |
| | | if !ok { |
| | | return |
| | | } |
| | | number := c.Param("number") |
| | | client := product_inventory.NewProductInventoryServiceClient(ProductInventoryServiceConn) |
| | | info, err := client.GetInventoryProductInfo(ctx.GetCtx(), &product_inventory.GetInventoryProductInfoRequest{Number: number}) |
| | | if err != nil { |
| | | logx.Errorf("GetProductInfo err: %v", err.Error()) |
| | | ctx.FailWithMsg(ecode.UnknownErr, "grpc调用错误") |
| | | return |
| | | } |
| | | var list []response.ProductInfo |
| | | err = structx.AssignTo(info.ProductList, &list) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "转换错误") |
| | | return |
| | | } |
| | | ctx.OkWithDetailed(list) |
| | | } |
| | | |
| | | // CreateOperation |
| | | // |
| | | // @Tags SalesDetails |
| | | // @Summary 创建产品出库信息 |
| | | // @Produce application/json |
| | | // @Param object body request.SalesDetails true "查询参数" |
| | | // @Success 200 {object} response.ListResponse |
| | | // |
| | | // @Router /api/salesDetails/createOperation [post] |
| | | func (s *SalesDetailsApi) CreateOperation(c *gin.Context) { |
| | | var params request.SalesDetails |
| | | ctx, ok := contextx.NewContext(c, ¶ms) |
| | | if !ok { |
| | | return |
| | | } |
| | | m := make(map[string]interface{}) |
| | | m["status"] = params.Status |
| | | err := model.NewSalesDetailsSearch().SetNumber(params.Number).UpdateByMap(m) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "状态更新失败") |
| | | return |
| | | } |
| | | |
| | | client := product_inventory.NewProductInventoryServiceClient(ProductInventoryServiceConn) |
| | | products := make([]*product_inventory.InventoryProduct, 0) |
| | | for _, product := range params.Products { |
| | | var p product_inventory.InventoryProduct |
| | | p.Id = product.Number |
| | | p.Amount = product.Amount.String() |
| | | products = append(products, &p) |
| | | } |
| | | _, err = client.CreateOperation(ctx.GetCtx(), &product_inventory.CreateOperationRequest{ |
| | | Number: params.Number, |
| | | Addressee: params.Addressee, |
| | | Address: params.Address, |
| | | Phone: params.Phone, |
| | | DeliverType: int32(params.DeliverType), |
| | | ProductList: products, |
| | | }) |
| | | if err != nil { |
| | | logx.Errorf("CreateOperation err: %v", err.Error()) |
| | | ctx.FailWithMsg(ecode.UnknownErr, "grpc调用错误") |
| | | return |
| | | } |
| | | ctx.Ok() |
| | | } |
| | | |
| | | // GetApsProjectList |
| | | // |
| | | // @Tags SalesDetails |
| | | // @Summary 获取aps项目列表 |
| | | // @Produce application/json |
| | | // @Success 200 {object} response.Response |
| | | // |
| | | // @Router /api/salesDetails/getApsProjectList [get] |
| | | func (s *SalesDetailsApi) GetApsProjectList(c *gin.Context) { |
| | | ctx, ok := contextx.NewContext(c, nil) |
| | | if !ok { |
| | | return |
| | | } |
| | | client := crm_aps.NewCrmAndApsGrpcServiceClient(grpc_init.CrmApsGrpcServiceConn) |
| | | projectList, err := client.GetApsProjectList(c, &crm_aps.GetApsProjectListRequest{}) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "grpc调用错误: "+err.Error()) |
| | | return |
| | | } |
| | | ctx.OkWithDetailed(projectList.List) |
| | | } |
| | | |
| | | // SendSalesDetailsToApsProject |
| | | // |
| | | // @Tags SalesDetails |
| | | // @Summary 推送销售明细信息到aps项目模块 |
| | | // @Produce application/json |
| | | // @Param object body request.SalesDetails true "查询参数" |
| | | // @Success 200 {object} response.ListResponse |
| | | // |
| | | // @Router /api/salesDetails/sendSalesDetailsToApsProject [post] |
| | | func (s *SalesDetailsApi) SendSalesDetailsToApsProject(c *gin.Context) { |
| | | var params request.SalesDetails |
| | | ctx, ok := contextx.NewContext(c, ¶ms) |
| | | if !ok { |
| | | return |
| | | } |
| | | m := make(map[string]interface{}) |
| | | m["status"] = params.Status |
| | | err := model.NewSalesDetailsSearch().SetNumber(params.Number).UpdateByMap(m) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "状态更新失败") |
| | | return |
| | | } |
| | | |
| | | products := make([]*crm_aps.SalesDetailsProduct, 0) |
| | | var total decimal.Decimal |
| | | for _, product := range params.Products { |
| | | var sp crm_aps.SalesDetailsProduct |
| | | sp.ProductId = product.Number |
| | | sp.Amount = product.Amount.IntPart() |
| | | products = append(products, &sp) |
| | | total = total.Add(product.Amount) |
| | | } |
| | | |
| | | client := crm_aps.NewCrmAndApsGrpcServiceClient(grpc_init.CrmApsGrpcServiceConn) |
| | | _, err = client.SendSalesDetailsToApsProject(c, &crm_aps.SendSalesDetailsToApsProjectRequest{ |
| | | Number: params.Number, |
| | | ClientName: params.Client.Name, |
| | | MemberName: params.Member.Username, |
| | | SignTime: params.SignTime, |
| | | DeliveryDate: params.DeliveryDate, |
| | | Source: params.Source, |
| | | ProductTotal: total.IntPart(), |
| | | ProjectId: params.ProjectId, |
| | | Products: products, |
| | | }) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "grpc调用错误: "+err.Error()) |
| | | return |
| | | } |
| | | ctx.Ok() |
| | | } |