package controllers import ( "errors" "fmt" "regexp" "strconv" "strings" "time" "unicode/utf8" "github.com/astaxie/beego/logs" orderCmd "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/orderinfo/command" orderQuery "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/orderinfo/query" orderService "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/orderinfo/service" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/lib" ) type OrderInfoController struct { BaseController } ////Prepare 重写 BaseController 的Prepare方法 func (c *OrderInfoController) Prepare() { c.BaseController.Prepare() if ok := c.ValidJWTToken(); !ok { return } if ok := c.ValidAdminPermission(domain.PERMISSION_ORDER); !ok { return } } //PageListOrderPurpose 分页获取意向订单列表 func (c *OrderInfoController) PageListOrderPurpose() { type Parameter struct { SearchText string `json:"searchText"` Partner int64 `json:"partner"` PageSize int `json:"pageSize"` PageNumber int `json:"pageNumber"` } var ( param Parameter err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } if param.PageNumber == 0 { param.PageNumber = 1 } if param.PageSize == 0 { param.PageSize = 20 } companyId := c.GetUserCompany() orderSrv := orderService.NewOrderInfoService(nil) orderinfos, cnt, err := orderSrv.PageListOrderBase(orderQuery.ListOrderBaseQuery{ PartnerId: param.Partner, OrderCode: param.SearchText, OrderType: domain.OrderIntention, Limit: param.PageSize, Offset: (param.PageNumber - 1) * param.PageSize, CompanyId: companyId, }) if err != nil { c.ResponseError(err) return } rsp := []map[string]interface{}{} for i := range orderinfos { orderinfo := orderinfos[i] m := map[string]interface{}{ "createTime": orderinfo.CreateTime.Local().Format("2006-01-02 15:04:05"), "updateTime": orderinfo.UpdateTime.Local().Format("2006-01-02 15:04:05"), "buyer": orderinfo.Buyer.BuyerName, "id": orderinfo.Id, "orderId": orderinfo.OrderCode, "partner": orderinfo.PartnerInfo.PartnerName, "orderNum": orderinfo.OrderCompute.PlanOrderCount, "orderPrice": orderinfo.OrderCompute.PlanOrderAmount, "orderDist": orderinfo.RegionInfo.RegionName, } rsp = append(rsp, m) } c.ResponsePageList(rsp, cnt, param.PageNumber) } //GetOrderPurpose 获取意向订单详情 func (c *OrderInfoController) GetOrderPurpose() { type Parameter struct { Id string `json:"id"` } var ( param Parameter err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } orderid, _ := strconv.ParseInt(param.Id, 10, 64) companyId := c.GetUserCompany() orderSrv := orderService.NewOrderInfoService(nil) orderinfo, err := orderSrv.GetOrderDetail(orderQuery.GetOrderQuery{ OrderId: orderid, CompanyId: companyId, }) if err != nil { c.ResponseError(err) return } if orderinfo.OrderType != domain.OrderIntention { c.ResponseError(errors.New("参数错误")) return } allGoods := []map[string]interface{}{} for _, v := range orderinfo.Goods { m := map[string]interface{}{ "id": v.Id, "productName": v.GoodName, "orderNum": v.PlanGoodNumber, "univalence": v.Price, "partnerRatio": v.PartnerBonusPercent, "orderPrice": v.GoodCompute.PlanAmount, } allGoods = append(allGoods, m) } rsp := map[string]interface{}{ "buyer": orderinfo.Buyer.BuyerName, "id": orderinfo.Id, "partnerID": orderinfo.PartnerInfo.Id, "partner": orderinfo.PartnerInfo.PartnerName, "orderDist": orderinfo.RegionInfo.RegionName, "orderId": orderinfo.OrderCode, "product": allGoods, "commissionProportion": orderinfo.SalesmanBonusPercent, "orderNumCount": orderinfo.OrderCompute.PlanOrderCount, "orderAmountAdjustmentCount": orderinfo.OrderCompute.PlanOrderAmount, } c.ResponseData(rsp) } //RemoveOrderPurpose 删除意向订单 func (c *OrderInfoController) RemoveOrderPurpose() { type Parameter struct { Id int64 `json:"id"` } var ( param Parameter err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } companyId := c.GetUserCompany() orderSrv := orderService.NewOrderInfoService(nil) err = orderSrv.DeleteOrder(param.Id, companyId) if err != nil { c.ResponseError(err) return } c.ResponseData(nil) } //postPurposeOrderDetail 请求添加/更新的订单数据 type postPurposeOrderDetail struct { Id int64 `json:"id"` //订单编号 OrderId string `json:"orderId"` //买家姓名 BuyerName string `json:"buyer"` //对应合伙人 id PartnerId int64 `json:"partnerID"` //业务员抽成比例 CommissionProportion float64 `json:"commissionProportion"` //订单区域 OrderDist string `json:"orderDist"` //商品 Product []postOrderGood `json:"product"` } func (postData *postPurposeOrderDetail) Valid() error { postData.OrderId = strings.TrimSpace(postData.OrderId) postData.BuyerName = strings.TrimSpace(postData.BuyerName) postData.OrderDist = strings.TrimSpace(postData.OrderDist) if len(postData.OrderId) == 0 { return lib.ThrowError(lib.ARG_ERROR, "订单编号必填") } if len(postData.BuyerName) == 0 { return lib.ThrowError(lib.ARG_ERROR, "买家信息必填") } if postData.PartnerId == 0 { return lib.ThrowError(lib.ARG_ERROR, "合伙人信息必填") } if len(postData.OrderDist) == 0 { return lib.ThrowError(lib.ARG_ERROR, "订单区域必填") } if len(postData.Product) == 0 { return lib.ThrowError(lib.ARG_ERROR, "货品列表必填") } if len(postData.Product) > 50 { return lib.ThrowError(lib.ARG_ERROR, "货品列表最多50项") } for i := range postData.Product { if err := postData.Product[i].Valid(); err != nil { return err } } return nil } //PostPurposeOrderGood 请求添加/更新订单中的货品 type postOrderGood struct { Id int64 `json:"id"` ProductName string `json:"productName"` OrderNum int `json:"orderNum"` Univalence float64 `json:"univalence"` PartnerRatio float64 `json:"partnerRatio"` } func (postData *postOrderGood) Valid() error { postData.ProductName = strings.TrimSpace(postData.ProductName) lenProductName := utf8.RuneCountInString(postData.ProductName) if lenProductName == 0 { return lib.ThrowError(lib.ARG_ERROR, "商品名称必填") } if lenProductName > 50 { return lib.ThrowError(lib.ARG_ERROR, "商品名称最多50位") } if postData.OrderNum >= 1e16 { return lib.ThrowError(lib.ARG_ERROR, "商品数量最多16位") } if postData.Univalence >= 1e16 { return lib.ThrowError(lib.ARG_ERROR, "商品单价最多16位") } if postData.PartnerRatio > 100 { return lib.ThrowError(lib.ARG_ERROR, "合伙人分红比例超额") } partnerRatio := fmt.Sprint(postData.PartnerRatio) regexpStr := `^(100|[1-9]\d|\d)(.\d{1,2})?$` ok := regexp.MustCompile(regexpStr).MatchString(partnerRatio) if !ok { return lib.ThrowError(lib.ARG_ERROR, "合伙人分红比例精确到小数点2位") } return nil } //UpdateOrderPurpose 更新意向订单 func (c *OrderInfoController) UpdateOrderPurpose() { //用与适配前端定义的数据结构 var ( param postPurposeOrderDetail err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } if err := param.Valid(); err != nil { c.ResponseError(err) return } if param.Id == 0 { err = c.addOrderPurpose(param) } else { err = c.editOrderPurpose(param) } if err != nil { c.ResponseError(err) } c.ResponseData(nil) return } func (c *OrderInfoController) addOrderPurpose(param postPurposeOrderDetail) error { newGoods := []orderCmd.OrderGoodData{} for _, v := range param.Product { g := orderCmd.OrderGoodData{ GoodName: v.ProductName, PlanGoodNumber: v.OrderNum, Price: v.Univalence, PartnerBonusPercent: v.PartnerRatio, } newGoods = append(newGoods, g) } companyId := c.GetUserCompany() createcmd := orderCmd.CreateOrderCommand{ OrderType: domain.OrderIntention, OrderCode: param.OrderId, DeliveryCode: "", BuyerName: param.BuyerName, OrderRegion: param.OrderDist, PartnerId: param.PartnerId, SalesmanBonusPercent: param.CommissionProportion, Goods: newGoods, CompanyId: companyId, } orderSrv := orderService.NewOrderInfoService(nil) _, err := orderSrv.CreateNewOrder(createcmd) return err } func (c *OrderInfoController) editOrderPurpose(param postPurposeOrderDetail) error { orderSrv := orderService.NewOrderInfoService(nil) newGoods := []orderCmd.OrderGoodData{} for _, v := range param.Product { g := orderCmd.OrderGoodData{ GoodName: v.ProductName, PlanGoodNumber: v.OrderNum, Price: v.Univalence, PartnerBonusPercent: v.PartnerRatio, } newGoods = append(newGoods, g) } companyId := c.GetUserCompany() updatecmd := orderCmd.UpdateOrderCommand{ Id: param.Id, OrderType: domain.OrderIntention, OrderCode: param.OrderId, DeliveryCode: "", BuyerName: param.BuyerName, OrderRegion: param.OrderDist, PartnerId: param.PartnerId, SalesmanBonusPercent: param.CommissionProportion, Goods: newGoods, CompanyId: companyId, } _, err := orderSrv.UpdateOrderData(updatecmd) return err } type postOrderPurposeDelivery struct { ShipmentsId string `json:"shipmentsId"` //发货单号 Id string `json:"id"` //订单id ProductDetail []postOrderGood `json:"productDetail"` } func (postData *postOrderPurposeDelivery) Valid() error { postData.ShipmentsId = strings.TrimSpace(postData.ShipmentsId) lenShipmentsId := utf8.RuneCountInString(postData.ShipmentsId) if lenShipmentsId == 0 { return lib.ThrowError(lib.ARG_ERROR, "发货单号必填") } if lenShipmentsId > 50 { return lib.ThrowError(lib.ARG_ERROR, "发货单号最多50位") } for i := range postData.ProductDetail { if err := postData.ProductDetail[i].Valid(); err != nil { return err } } return nil } //OrderPurposeDelivery 发货 意向订单转实发单 func (c *OrderInfoController) OrderPurposeDelivery() { //用与适配前端定义的数据结构 var ( param postOrderPurposeDelivery err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } param.ShipmentsId = strings.TrimSpace(param.ShipmentsId) orderid, _ := strconv.ParseInt(param.Id, 10, 64) if orderid <= 0 { c.ResponseError(errors.New("参数错误")) return } if err = param.Valid(); err != nil { c.ResponseError(err) return } goods := []orderCmd.OrderGoodData{} for _, v := range param.ProductDetail { g := orderCmd.OrderGoodData{ Id: v.Id, GoodName: v.ProductName, PlanGoodNumber: v.OrderNum, Price: v.Univalence, PartnerBonusPercent: v.PartnerRatio, } goods = append(goods, g) } companyId := c.GetUserCompany() deliveryCommand := orderCmd.OrderDeliveryCommand{ OrderId: orderid, DeliveryCode: param.ShipmentsId, DeliveryTime: time.Now(), Goods: goods, CompanyId: companyId, } orderSrv := orderService.NewOrderInfoService(nil) err = orderSrv.Delivery(deliveryCommand) if err != nil { c.ResponseError(err) } c.ResponseData(nil) return } //PageListOrderReal 获取实发订单列表 func (c *OrderInfoController) PageListOrderReal() { type Parameter struct { SearchText string `json:"searchText"` Partner int64 `json:"partner"` PageSize int `json:"pageSize"` PageNumber int `json:"pageNumber"` } var ( param Parameter err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } if param.PageNumber == 0 { param.PageNumber = 1 } if param.PageSize == 0 { param.PageSize = 20 } companyId := c.GetUserCompany() orderSrv := orderService.NewOrderInfoService(nil) orderinfos, cnt, err := orderSrv.PageListOrderBase(orderQuery.ListOrderBaseQuery{ PartnerId: param.Partner, DeliveryCode: param.SearchText, OrderType: domain.OrderReal, Limit: param.PageSize, Offset: (param.PageNumber - 1) * param.PageSize, CompanyId: companyId, }) if err != nil { c.ResponseError(err) return } rsp := []map[string]interface{}{} for i := range orderinfos { orderinfo := orderinfos[i] m := map[string]interface{}{ "createTime": orderinfo.CreateTime.Local().Format("2006-01-02 15:04:05"), "updateTime": orderinfo.UpdateTime.Local().Format("2006-01-02 15:04:05"), "buyer": orderinfo.Buyer.BuyerName, "id": orderinfo.Id, "orderId": orderinfo.OrderCode, "shipmentsId": orderinfo.DeliveryCode, "partner": orderinfo.PartnerInfo.PartnerName, "orderNum": orderinfo.OrderCompute.PlanOrderCount, "orderPrice": orderinfo.OrderCompute.PlanOrderAmount, "orderDist": orderinfo.RegionInfo.RegionName, "quantityControl": "", "priceControl": "", "status": orderinfo.IsDisable, } if orderinfo.OrderCompute.UseOrderCount >= 0 { m["quantityControl"] = fmt.Sprint(orderinfo.OrderCompute.UseOrderCount) } if orderinfo.OrderCompute.UseOrderAmount >= 0 { m["priceControl"] = fmt.Sprint(orderinfo.OrderCompute.UseOrderAmount) } rsp = append(rsp, m) } c.ResponsePageList(rsp, cnt, param.PageNumber) return } //GetOrderReal 获取实发订单详情 func (c *OrderInfoController) GetOrderReal() { type Parameter struct { Id string `json:"id"` } var ( param Parameter err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } orderid, _ := strconv.ParseInt(param.Id, 10, 64) if orderid == 0 { c.ResponseError(errors.New("参数错误")) return } companyId := c.GetUserCompany() orderSrv := orderService.NewOrderInfoService(nil) orderinfo, err := orderSrv.GetOrderDetail(orderQuery.GetOrderQuery{ OrderId: orderid, CompanyId: companyId, }) if err != nil { c.ResponseError(err) return } if orderinfo.OrderType != domain.OrderReal { c.ResponseError(errors.New("参数错误")) return } allGoods := []map[string]interface{}{} for _, v := range orderinfo.Goods { m := map[string]interface{}{ "id": v.Id, "productName": v.GoodName, "orderNum": v.PlanGoodNumber, "univalence": v.Price, "partnerRatio": v.PartnerBonusPercent, "orderPrice": v.GoodCompute.PlanAmount, "quantityControl": "", "priceControl": "", } if v.GoodCompute.UseAmount >= 0 { m["priceControl"] = fmt.Sprint(v.GoodCompute.UseAmount) } if v.UseGoodNumber >= 0 { m["quantityControl"] = fmt.Sprint(v.UseGoodNumber) } allGoods = append(allGoods, m) } rsp := map[string]interface{}{ "buyer": orderinfo.Buyer.BuyerName, "id": orderinfo.Id, "partnerID": orderinfo.PartnerInfo.Id, "partner": orderinfo.PartnerInfo.PartnerName, "orderDist": orderinfo.RegionInfo.RegionName, "orderId": orderinfo.OrderCode, "shipmentsId": orderinfo.DeliveryCode, "commissionProportion": orderinfo.SalesmanBonusPercent, "orderNumCount": orderinfo.OrderCompute.PlanOrderCount, "orderAmountAdjustmentCount": orderinfo.OrderCompute.PlanOrderAmount, "orderNumCountControl": "", "orderAmountAdjustmentCountControl": "", "product": allGoods, "create_time": orderinfo.CreateTime.Local().Format("2006-01-02 15:04:06"), "update_time": orderinfo.UpdateTime.Local().Format("2006-01-02 15:04:06"), } if orderinfo.OrderCompute.UseOrderAmount >= 0 { rsp["orderNumCountControl"] = fmt.Sprint(orderinfo.OrderCompute.UseOrderCount) } if orderinfo.OrderCompute.UseOrderCount >= 0 { rsp["orderAmountAdjustmentCountControl"] = fmt.Sprint(orderinfo.OrderCompute.UseOrderAmount) } c.ResponseData(rsp) return } //实际订单 type postRealOrderDetail struct { postPurposeOrderDetail ShipmentsId string `json:"shipmentsId"` //发货单号 } func (postData *postRealOrderDetail) Valid() error { postData.ShipmentsId = strings.TrimSpace(postData.ShipmentsId) if len(postData.ShipmentsId) == 0 { return lib.ThrowError(lib.ARG_ERROR, "订单的发货单号必填") } if err := postData.postPurposeOrderDetail.Valid(); err != nil { return err } return nil } //UpdateOrderReal 编辑实际订单 func (c *OrderInfoController) UpdateOrderReal() { //用与适配前端定义的数据结构 var ( param postRealOrderDetail err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } if err := param.Valid(); err != nil { c.ResponseError(err) return } if param.Id == 0 { err = c.addOrderReal(param) } else { err = c.editOrderReal(param) } if err != nil { c.ResponseError(err) } c.ResponseData(nil) return } func (c *OrderInfoController) addOrderReal(param postRealOrderDetail) error { orderSrv := orderService.NewOrderInfoService(nil) newGoods := []orderCmd.OrderGoodData{} for _, v := range param.Product { g := orderCmd.OrderGoodData{ GoodName: v.ProductName, PlanGoodNumber: v.OrderNum, Price: v.Univalence, PartnerBonusPercent: v.PartnerRatio, } newGoods = append(newGoods, g) } companyId := c.GetUserCompany() createcmd := orderCmd.CreateOrderCommand{ OrderType: domain.OrderReal, OrderCode: param.OrderId, DeliveryCode: param.ShipmentsId, BuyerName: param.BuyerName, OrderRegion: param.OrderDist, PartnerId: param.PartnerId, SalesmanBonusPercent: param.CommissionProportion, Goods: newGoods, CompanyId: companyId, } _, err := orderSrv.CreateNewOrder(createcmd) return err } func (c *OrderInfoController) editOrderReal(param postRealOrderDetail) error { newGoods := []orderCmd.OrderGoodData{} for _, v := range param.Product { g := orderCmd.OrderGoodData{ GoodName: v.ProductName, PlanGoodNumber: v.OrderNum, Price: v.Univalence, PartnerBonusPercent: v.PartnerRatio, } newGoods = append(newGoods, g) } companyId := c.GetUserCompany() updatecmd := orderCmd.UpdateOrderCommand{ Id: param.Id, OrderType: domain.OrderReal, OrderCode: param.OrderId, DeliveryCode: param.ShipmentsId, BuyerName: param.BuyerName, OrderRegion: param.OrderDist, PartnerId: param.PartnerId, SalesmanBonusPercent: param.CommissionProportion, Goods: newGoods, CompanyId: companyId, } orderSrv := orderService.NewOrderInfoService(nil) _, err := orderSrv.UpdateOrderData(updatecmd) return err } //OrderDisable 关闭开启订单,限实发订单可操作 func (c *OrderInfoController) OrderDisable() { //用与适配前端定义的数据结构 type PostParameter struct { Id string `json:"id"` Status int `json:"status"` } var ( param PostParameter err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } orderId, _ := strconv.ParseInt(param.Id, 10, 64) if orderId == 0 { c.ResponseError(errors.New("参数错误")) return } if !(param.Status == domain.OrderDisableNot || param.Status == domain.OrderDisableYes) { c.ResponseError(errors.New("参数错误")) return } companyId := c.GetUserCompany() cmd := orderCmd.DisableOrderCommand{ OrderId: orderId, IsDisable: param.Status, OrderType: domain.OrderReal, CompanyId: companyId, } orderSrv := orderService.NewOrderInfoService(nil) err = orderSrv.DisableOrEnable(cmd) if err != nil { c.ResponseError(err) } c.ResponseData(nil) return } //RemoveOrderReal 删除意向订单 func (c *OrderInfoController) RemoveOrderReal() { type Parameter struct { Id int64 `json:"id"` } var ( param Parameter err error ) if err = c.BindJsonData(¶m); err != nil { logs.Error(err) c.ResponseError(errors.New("json数据解析失败")) return } companyId := c.GetUserCompany() orderSrv := orderService.NewOrderInfoService(nil) err = orderSrv.DeleteOrder(param.Id, companyId) if err != nil { c.ResponseError(err) return } c.ResponseData(nil) }