package logic import ( "context" "lone-services/pkg/modelbase" "lone-services/pkg/utils" "lone-services/rpc/express/pb" "lone-services/services/express/internal/dao" "lone-services/services/express/internal/model" "lone-services/services/express/internal/svc" "strconv" "github.com/zeromicro/go-zero/core/logx" ) type ExpressDeliveringLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger BaseLogic } func NewExpressDeliveringLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ExpressDeliveringLogic { return &ExpressDeliveringLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // ExpressDelivering 发货 func (l *ExpressDeliveringLogic) ExpressDelivering(in *express.DeliveringRequest) (*express.Response, error) { var itemsEdit []dao.DeliveryOrderPrintEdit w := modelbase.Params{ Eq: map[string]string{"id": strconv.FormatInt(in.Id, utils.NumberTen)}} modelObj := model.DeliveryOrderModel{}.Init() err := modelObj.Items(w, &itemsEdit) if err != nil { l.Logger.Error(err) return l.fail(utils.Fail) } if len(itemsEdit) < utils.NumberOne { return l.fail(utils.ErrorNotFund) } if itemsEdit[utils.NumberZero].Status == dao.SendStatusOk || itemsEdit[utils.NumberZero].Status == dao.SendStatusOver { return l.fail(utils.ErrorOrderOver) } //if transitId < dao.NumberOne { // transitId = utils.GetConfigInt("transit.send_id") //} //tw := models.Params{Eq: map[string]string{"id": strconv.Itoa(transitId)}} //var transitInfo dao.TransitSend //err = models.TransitModel{}.Init().GetOne(tw, &transitInfo) //if err != nil { // utils.Logger.Error("发货地址信息没有找到", transitId, err) // return dao.DeliverGoodsPrint{}, utils.Define(utils.ErrorNotFund, "没有查询到发货信息") //} //if transitInfo.Id < dao.NumberOne { // return dao.DeliverGoodsPrint{}, utils.Define(utils.ErrorNotFund, "没有查询到发货信息") //} // //var items []dao.DeliverGoodsPrint //items = append(items, dao.DeliverGoodsPrint{ // DeliverGoodsPrintEdit: itemsEdit[dao.NumberZero], //}) //s.getOrderInfo(&items) //info := itemsEdit[dao.NumberZero] ////更新使用的快递类型 //info.TransitType = transitInfo.TransitId // //info.OrderSn = s.getOrderSn(info.TransitType, u.Id) //items[dao.NumberZero].OrderSn = info.OrderSn //status := info.Status //client, res, cErr := s.createTransit(items[dao.NumberZero], transitInfo) //if cErr != nil { // return dao.DeliverGoodsPrint{}, cErr //} //info.TransitInfo = res.PostInfo //info.TransitContent = res.RequestInfo //info.TransitSn = strings.Join(res.WaybillNo, utils.DecollatorComma) // //items[dao.NumberZero].AdminName = u.Name //res2, gErr := s.getDown(client, res.WaybillNo, items[dao.NumberZero]) //if gErr != nil { // s.cancel(client, w, info, status) // utils.Logger.Error(res2, gErr) // return dao.DeliverGoodsPrint{}, utils.Define(utils.ErrorNotFund, "下载发货单出错") //} // //info.Express = utils.StructToJson(res2.Files) //info.PrintStatus = dao.StatusOk //info.AdminId = u.Id //info.AdminName = u.Name //info.TransitId = transitId //info.TransitName = transitInfo.Name //info.Status = models.SendStatusOk //info.SendTime = utils.Now() // //items[dao.NumberZero].PrintStatus = info.PrintStatus //items[dao.NumberZero].AdminId = info.AdminId //items[dao.NumberZero].AdminName = info.AdminName //items[dao.NumberZero].TransitId = info.TransitId //items[dao.NumberZero].TransitInfo = info.TransitInfo //items[dao.NumberZero].TransitContent = info.TransitContent //items[dao.NumberZero].TransitSn = info.TransitSn //items[dao.NumberZero].TransitName = info.TransitName //items[dao.NumberZero].Status = info.Status //items[dao.NumberZero].Express = info.Express // //var history dao.DeliverGoodsHistoryCreate //history.DeliverId = info.Id //history.TransitName = models.DeliverSendType[info.TransitType] //history.TransitInfo = info.TransitInfo //history.TransitContent = info.TransitContent //history.TransitType = info.TransitType //history.OrderSn = info.OrderSn // //var exps []dao.DeliverGoodsExpCreate //for i := 0; i < len(res.WaybillNo); i++ { // exps = append(exps, dao.DeliverGoodsExpCreate{ // DeliverGoodsId: info.Id, // TransitType: info.TransitType, // ExpSn: res.WaybillNo[i], // OrderSn: info.OrderSn, // }) //} // //sErr := s.saveDelever(w, &info, &history, &exps) //if sErr != nil { // s.cancel(client, w, info, status) // utils.Logger.Error(res2, sErr) // return dao.DeliverGoodsPrint{}, sErr //} // //return items[dao.NumberZero], nil return &express.Response{}, nil } //func (l *ExpressDeliveringLogic) createTransit(info dao.DeliverGoodsPrint, transitInfo dao.TransitSend) (transit.Transit, transit.TransitResult, utils.Error) { // var client transit.Transit // switch transitInfo.TransitId { // case models.TransitCompanySf: // client = transit.NewSfClient(transitInfo) // case models.TransitCompanyJd: // client = transit.NewJdClient(transitInfo) // default: // return client, transit.TransitResult{}, utils.Define(utils.Fail, "不支持的快递公司") // } // res, err := client.Create(info) // if err != nil || res.ErrorCode != dao.StatusOkString { // utils.Logger.Error("create transit err", err, res) // return client, res, utils.Define(utils.Fail, res.ApiErrorMsg) // } // // return client, res, nil //} // //func (l *ExpressDeliveringLogic) saveDelever(w models.Params, info *dao.DeliverGoodsPrintEdit, history *dao.DeliverGoodsHistoryCreate, exps *[]dao.DeliverGoodsExpCreate) utils.Error { // model := models.DeliverGoodsModel{}.Init() // model.Begin() // edit, err := model.Edit(w, info) // if err != nil || edit < utils.NumberOne { // model.Rollback() // utils.Logger.Error("save deliver goods err ", err) // return utils.Define(utils.Fail, "生成快递单失败") // } // // err = models.DeliverGoodsExpModel{}.Init().CreateMulti(exps) // if err != nil { // model.Rollback() // utils.Logger.Error("save exp err ", err) // return utils.Define(utils.Fail, "生成EXP失败") // } // // err = models.DeliverGoodsHistoryModel{}.Init().Create(history) // if err != nil { // model.Rollback() // utils.Logger.Error("save history err ", err) // return utils.Define(utils.Fail, "生成订单历史失败") // } // // if info.Type == models.DeliverTypeOrder { // w = models.Params{Eq: map[string]string{"id": info.ObjId}} // orderStatus := dao.OrderDeliverGoodsStatus{ // DeliverStatus: info.Status, // } // _, err = models.OrderModel{}.Init().Edit(w, &orderStatus) // if err != nil { // model.Rollback() // utils.Logger.Error("save update order err ", err) // return utils.Define(utils.Fail, "更新订单状态失败") // } // } // // model.Commit() // return nil //} //func (l *ExpressDeliveringLogic) getOrderInfo(items *[]dao.DeliverGoodsPrint) { // products := s.getProducts() // for value, item := range *items { // obj := &(*items)[value] // mobile, aErr := utils.Crypto{}.AESDecryptECB(item.Mobile) // if aErr == nil { // obj.Mobile = mobile // } // obj.Url = utils.GetConfigString("transit.url") // obj.Number, obj.Weight, obj.ProductItems = s.getProductInfo(item.ObjSn, item.ProductInfo, &products) // } //} //func (l *ExpressDeliveringLogic) getOrderSn(orderType uint8, adminId int) string { // first := models.DeliverSendType[orderType] // // sn := first + time.Now().Format("20060102150405") // sn += fmt.Sprintf("%d%d", orderType, adminId) // randomNum := rand.Intn(90000000) + 10000000 // sn += fmt.Sprintf("%d", randomNum) // // return sn //} // //func (l *ExpressDeliveringLogic) createTransit(info dao.DeliverGoodsPrint, transitInfo dao.TransitSend) (transit.Transit, transit.TransitResult, utils.Error) { // var client transit.Transit // switch transitInfo.TransitId { // case models.TransitCompanySf: // client = transit.NewSfClient(transitInfo) // case models.TransitCompanyJd: // client = transit.NewJdClient(transitInfo) // default: // return client, transit.TransitResult{}, utils.Define(utils.Fail, "不支持的快递公司") // } // res, err := client.Create(info) // if err != nil || res.ErrorCode != dao.StatusOkString { // utils.Logger.Error("create transit err", err, res) // return client, res, utils.Define(utils.Fail, res.ApiErrorMsg) // } // // return client, res, nil //} //func (s PrintService) getDown(client transit.Transit, orders []string, info dao.DeliverGoodsPrint) (transit.TransitResult, error) { // ret, err := client.DownSheet(orders, info) // if err != nil || len(ret.Files) < dao.NumberOne { // utils.Logger.Error("get down err ", orders, err, ret) // if len(ret.Files) < dao.NumberOne { // err = errors.New("files is empty") // } // return ret, err // } // path := utils.GetConfigString("transit.path") + "/" // var tmpFiles []transit.TransitFiles // for i := 0; i < len(ret.Files); i++ { // tName := ret.Files[i].WaybillNo + ".pdf" // err := s.downloadSfPDF(ret.Files[i], path+tName) // if err != nil { // utils.Logger.Error("get down err ", orders, err, ret) // return ret, err // } // // tmpFiles = append(tmpFiles, transit.TransitFiles{ // File: tName, // WaybillNo: ret.Files[i].WaybillNo, // }) // } // // ret.Files = tmpFiles // // return ret, nil //} // //func (s PrintService) downloadSfPDF(file transit.TransitFiles, path string) error { // req, err := http.NewRequest("GET", file.Url, nil) // if err != nil { // return err // } // // // 2. 必须加这个请求头(顺丰强制) // req.Header.Add("X-Auth-token", file.Token) // // 3. 发送请求 // client := &http.Client{} // resp, err := client.Do(req) // if err != nil { // return err // } // defer func(Body io.ReadCloser) { // err := Body.Close() // if err != nil { // utils.Logger.Error(err) // } // }(resp.Body) // // 4. 创建目录 // if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { // return err // } // // 5. 创建文件并保存 // outFile, err := os.Create(path) // if err != nil { // return err // } // defer func(outFile *os.File) { // err = outFile.Close() // if err != nil { // utils.Logger.Error(err) // } // }(outFile) // // 6. 拷贝数据 // _, err = io.Copy(outFile, resp.Body) // return err //} // //func (s PrintService) cancel(client transit.Transit, w models.Params, info dao.DeliverGoodsPrintEdit, status uint8) { // sn := info.OrderSn // if info.TransitType == models.TransitCompanyJd { // sn = info.TransitSn // } // // ret, canErr := client.Cancel(sn) // if canErr != nil || ret.ErrorCode != dao.StatusOkString { // utils.Logger.Error("cancel order err ", sn, canErr, ret) // return // } // var history dao.DeliverGoodsHistoryCreate // history.DeliverId = info.Id // history.TransitName = models.DeliverSendType[info.TransitType] // history.TransitInfo = ret.PostInfo // history.TransitContent = ret.RequestInfo // history.TransitType = info.TransitType // history.OrderSn = info.OrderSn // // info.OrderSn = dao.StringEmpty // info.Status = status // info.Express = dao.StringEmpty // _, err := models.DeliverGoodsModel{}.Init().Edit(w, &info) // models.DeliverGoodsHistoryModel{}.Init().Create(&history) // ww := models.Params{Eq: map[string]string{"deliver_goods_id": strconv.Itoa(info.Id)}} // editExp := dao.DeliverGoodsExpStatus{ // Status: dao.StatusFail, // } // models.DeliverGoodsExpModel{}.Init().Edit(ww, &editExp) // if err != nil { // utils.Logger.Error("cancel up order err ", info.Id, err) // } // if info.Type == models.DeliverTypeOrder { // w = models.Params{Eq: map[string]string{"id": info.ObjId}} // up := dao.OrderDeliverGoodsStatus{ // DeliverStatus: status, // } // _, err = models.OrderModel{}.Init().Edit(w, &up) // if err != nil { // utils.Logger.Error("cancel up order err ", info.ObjSn, err) // } // } //} // //func (s PrintService) createTransit(info dao.DeliverGoodsPrint, transitInfo dao.TransitSend) (transit.Transit, transit.TransitResult, utils.Error) { // var client transit.Transit // switch transitInfo.TransitId { // case models.TransitCompanySf: // client = transit.NewSfClient(transitInfo) // case models.TransitCompanyJd: // client = transit.NewJdClient(transitInfo) // default: // return client, transit.TransitResult{}, utils.Define(utils.Fail, "不支持的快递公司") // } // res, err := client.Create(info) // if err != nil || res.ErrorCode != dao.StatusOkString { // utils.Logger.Error("create transit err", err, res) // return client, res, utils.Define(utils.Fail, res.ApiErrorMsg) // } // // return client, res, nil //} // //func (s PrintService) saveDelever(w models.Params, info *dao.DeliverGoodsPrintEdit, history *dao.DeliverGoodsHistoryCreate, exps *[]dao.DeliverGoodsExpCreate) utils.Error { // model := models.DeliverGoodsModel{}.Init() // model.Begin() // edit, err := model.Edit(w, info) // if err != nil || edit < utils.NumberOne { // model.Rollback() // utils.Logger.Error("save deliver goods err ", err) // return utils.Define(utils.Fail, "生成快递单失败") // } // // err = models.DeliverGoodsExpModel{}.Init().CreateMulti(exps) // if err != nil { // model.Rollback() // utils.Logger.Error("save exp err ", err) // return utils.Define(utils.Fail, "生成EXP失败") // } // // err = models.DeliverGoodsHistoryModel{}.Init().Create(history) // if err != nil { // model.Rollback() // utils.Logger.Error("save history err ", err) // return utils.Define(utils.Fail, "生成订单历史失败") // } // // if info.Type == models.DeliverTypeOrder { // w = models.Params{Eq: map[string]string{"id": info.ObjId}} // orderStatus := dao.OrderDeliverGoodsStatus{ // DeliverStatus: info.Status, // } // _, err = models.OrderModel{}.Init().Edit(w, &orderStatus) // if err != nil { // model.Rollback() // utils.Logger.Error("save update order err ", err) // return utils.Define(utils.Fail, "更新订单状态失败") // } // } // // model.Commit() // return nil //}