You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

341 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package order
import (
"errors"
"log"
"recook/internal/api/manage/excel"
"recook/internal/cache"
"recook/internal/service"
"recook/internal/v2/model/gys/user"
manage2 "recook/internal/v2/model/recook/express"
manage "recook/internal/v2/model/recook/order"
"strings"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/golangkit/formatime"
"github.com/jinzhu/gorm"
)
const (
ExpressItemStatusFalse = 0 // 发货失败
ExpressItemStatusTrue = 1 // 发货成功
)
var Expresslogic = &expressLogic{}
type expressLogic struct {
}
// @Style 查询快递信息
func (e *expressLogic) Query(orderGoodsId uint) (result []service.Packet, err error) {
result = []service.Packet{}
recookOrderGoodsDetailModel := &manage.RecookOrderGoodsDetailModel{}
orderGoodsDetail := recookOrderGoodsDetailModel.FindById(orderGoodsId)
recookOrderAddrModel := &manage.RecookOrderAddrModel{}
orderAddr := recookOrderAddrModel.FindByOrderId(orderGoodsDetail.OrderId)
recookOrderGoodsExpressModel := &manage.RecookOrderGoodsExpressModel{}
orderGoodsExpress := recookOrderGoodsExpressModel.FindByOrderGoodsId(orderGoodsDetail.Id)
for _, express := range orderGoodsExpress {
pac, err := service.QueryPackage(orderAddr.Mobile, express.ExpressCompCode, express.ExpressNo)
if err != nil {
return result, err
}
pac.Name = express.ExpressCompName
pac.No = express.ExpressNo
pac.PicUrls = []string{}
result = append(result, pac)
}
return
}
type ExpressInfo struct {
ExpressCompName string `json:"expressCompName" form:"expressCompName"`
ExpressNo string `json:"expressNo" form:"expressNo"`
}
// @Style 修改快递信息
func (e *expressLogic) Update(user user.GysUsersModel, orderGoodsId uint, express []ExpressInfo) error {
userId := user.Id
if user.MainId != 0 {
userId = user.MainId
}
recookOrderGoodsDetailModel := &manage.RecookOrderGoodsDetailModel{}
orderGoodsDetail := recookOrderGoodsDetailModel.FindById(orderGoodsId)
return e.Express(userId, user.Username, orderGoodsDetail, express)
}
// @Style 统一处理订单发货信息
func (e *expressLogic) Express(userId uint, userName string, orderGoodsDetail manage.RecookOrderGoodsDetailModel, express []ExpressInfo) error {
if orderGoodsDetail.Id == 0 {
return errors.New("记录不存在")
}
if orderGoodsDetail.VendorId != userId {
return errors.New("记录不匹配")
}
if orderGoodsDetail.ExpressStatus == manage.RecookOrderInfoExpressStatusComp {
return errors.New("已收货")
}
if orderGoodsDetail.IsClosed == manage.RecookOrderInfoIsClosedTrue {
return errors.New("已关闭")
}
recookOrderGoodsDetailModel := &manage.RecookOrderGoodsDetailModel{}
if err := recookOrderGoodsDetailModel.Transaction(func(tx *gorm.DB) error {
recookOrderInfoModel := &manage.RecookOrderInfoModel{}
recookOrderInfoModel.SetDb(tx)
//载入快递数据
if err := recookOrderInfoModel.UpdateById(orderGoodsDetail.OrderId, &manage.RecookOrderInfoModel{
////更改快递已发货状态 订单表更新状态
ExpressStatus: manage.RecookOrderInfoExpressStatusIng,
}); err != nil {
return err
}
recookOrderGoodsExpressModel := &manage.RecookOrderGoodsExpressModel{}
recookOrderGoodsExpressModel.SetDb(tx)
if err := recookOrderGoodsExpressModel.DeleteByOrderGoodsId(orderGoodsDetail.Id); err != nil {
return err
}
flag := true
for _, info := range express {
log.Println(info.ExpressCompName, info.ExpressNo)
if info.ExpressCompName == "" || info.ExpressNo == "" {
continue
}
//expressCompCode := cache.GetExpressCompCode(info.ExpressCompName)
//log.Println(expressCompCode)
//if expressCompCode == "" {
// continue
//}
expressInfo := manage.RecookOrderGoodsExpressModel{
OrderId: orderGoodsDetail.OrderId,
ExpressTime: formatime.NewSecondNow(),
ExpressCompName: info.ExpressCompName,
ExpressCompCode: cache.GetExpressCompCode(info.ExpressCompName),
ExpressNo: info.ExpressNo,
OrderGoodsId: orderGoodsDetail.Id,
}
recookOrderGoodsExpressModel.Create(&expressInfo)
if expressInfo.Id == 0 {
flag = false
return errors.New("网络异常")
}
}
if !flag {
return errors.New("快递信息错误")
}
recookOrderGoodsDetailModel.SetDb(tx)
if err := recookOrderGoodsDetailModel.UpdateById(orderGoodsDetail.Id, userId, &manage.RecookOrderGoodsDetailModel{
ExpressStatus: manage.RecookOrderGoodsDetailExpressStatusTrue,
}); err != nil {
return err
}
// 发货记录
if orderGoodsDetail.ExpressStatus == manage.RecookOrderGoodsDetailExpressStatusNone {
if err := OrderLogic.Logs(orderGoodsDetail.Id, manage.RecookOrderGoodsDetailLogsTypeOrderExpress, "操作员:"+userName, "-"); err != nil {
return err
}
}
// // 订单商品发货钩子
// if orderGoodsDetail.ExpressStatus == manage.RecookOrderGoodsDetailExpressStatusNone {
// if err := hook.OrderHook.Express(&orderGoodsDetail); err != nil {
// return err
// }
// }
return nil
}); err != nil {
return err
}
return nil
}
// @Style 获取快递公司筛选
func (e *expressLogic) Select() []manage2.RecookExpressCompanyModel {
recookExpressCompanyModel := &manage2.RecookExpressCompanyModel{}
return recookExpressCompanyModel.All()
}
type ExpressItem struct {
Id uint `json:"id"`
OrderId uint `json:"orderId"`
GoodsName string `json:"goodsName"`
SkuName string `json:"skuName"`
ExpressCompanyName string `json:"expressCompanyName"`
ExpressNo string `json:"expressNo"`
Status *int
ErrMsg *string
}
type ExpressResult struct {
ExpressCompany map[string]int `json:"expressCompany"`
ExpressItem []*ExpressItem `json:"expressItem"`
OrderGoodsID []uint `json:"-"`
}
// @Style 批量发货
func (e *expressLogic) MulUpdate(user user.GysUsersModel, exl *excelize.File) (result ExpressResult) {
result = ExpressResult{
ExpressCompany: map[string]int{},
ExpressItem: []*ExpressItem{},
}
userId := user.Id
if user.MainId != 0 {
userId = user.MainId
}
allRows, _ := exl.GetRows(excel.SheetName) // 获取所有的行
recookOrderGoodsDetailModel := &manage.RecookOrderGoodsDetailModel{}
for _, row := range allRows[3:] {
if len(row) == 0 {
break
}
expressRow := excel.NewRow(row)
//fmt.Println(expressRow.ExpressNo)
//逗号分隔 获取到物流单号数组
//split函数有逗号则变成切片数组没有则返回本身
split := strings.Split(expressRow.ExpressNo, ";")
//
//遍历物流单号切片数组
errMsg := ""
tempStatus := ExpressItemStatusFalse
for _, s := range split {
if s == "" {
continue
}
//追加回显内容
result.ExpressItem = append(result.ExpressItem, &ExpressItem{
Id: expressRow.ID,
OrderId: expressRow.OrderID,
GoodsName: expressRow.GoodsName,
SkuName: expressRow.SkuName,
ExpressCompanyName: expressRow.ExpressCompanyName,
ExpressNo: s,
Status: &tempStatus,
ErrMsg: &errMsg,
})
}
if len(row) < 17 {
// 请填写快递信息
errMsg = "未填写快递信息"
continue
}
if expressRow.ID == 0 || expressRow.OrderID == 0 {
// 订单不存在
errMsg = "订单不存在"
continue
}
if cache.GetExpressCompCode(expressRow.ExpressCompanyName) == "" {
// 物流公司填写不正确
errMsg = "物流公司填写不正确"
continue
}
orderGoodsDetail := recookOrderGoodsDetailModel.FindById(expressRow.ID)
if orderGoodsDetail.Id == 0 {
// 订单商品错误
errMsg = "订单商品错误"
continue
}
if orderGoodsDetail.ExpressStatus != manage.RecookOrderGoodsDetailExpressStatusNone {
// 订单商品错误
errMsg = "订单商品已发货"
continue
}
express1 := []ExpressInfo{{
//ExpressCompName: expressRow.ExpressCompanyName,
//ExpressNo: "",
}}
for _, v := range split {
express2 := ExpressInfo{
ExpressCompName: expressRow.ExpressCompanyName,
ExpressNo: v,
}
express1 = append(express1, express2)
}
//发货处理
if err := e.Express(userId, user.Username, orderGoodsDetail, express1); err != nil {
errMsg = err.Error()
continue
}
result.ExpressCompany[expressRow.ExpressCompanyName]++
tempStatus = ExpressItemStatusTrue
result.OrderGoodsID = append(result.OrderGoodsID, orderGoodsDetail.Id)
//expItem := &ExpressItem{
// Id: expressRow.ID,
// OrderId: expressRow.OrderID,
// GoodsName: expressRow.GoodsName,
// SkuName: expressRow.SkuName,
// ExpressCompanyName: expressRow.ExpressCompanyName,
// ExpressNo: expressRow.ExpressNo,
// Status: ExpressItemStatusFalse,
// ErrMsg: "",
//}
//result.ExpressItem = append(result.ExpressItem, expItem)
//if len(row) < 17 {
// // 请填写快递信息
// expItem.ErrMsg = "未填写快递信息"
// continue
//}
//if expressRow.ID == 0 || expressRow.OrderID == 0 {
// // 订单不存在
// expItem.ErrMsg = "订单不存在"
// continue
//}
//
//if cache.GetExpressCompCode(expressRow.ExpressCompanyName) == "" {
// // 物流公司填写不正确
// expItem.ErrMsg = "物流公司填写不正确"
// continue
//}
//orderGoodsDetail := recookOrderGoodsDetailModel.FindById(expressRow.ID)
//if orderGoodsDetail.Id == 0 {
// // 订单商品错误
// expItem.ErrMsg = "订单商品错误"
// continue
//}
//if orderGoodsDetail.ExpressStatus != manage.RecookOrderGoodsDetailExpressStatusNone {
// // 订单商品错误
// expItem.ErrMsg = "订单商品已发货"
// continue
//}
//遍历物流单号数组
//express1 := []ExpressInfo{{
// ExpressCompName: expressRow.ExpressCompanyName,
// ExpressNo: expressRow.ExpressNo,
//}}
//for _, v := range split {
// express2 := ExpressInfo{
// ExpressCompName: expressRow.ExpressCompanyName,
// ExpressNo: v,
// }
// express1 = append(express1, express2)
//}
////发货处理
//if err := e.Express(userId, user.Username, orderGoodsDetail, express1); err != nil {
// expItem.ErrMsg = err.Error()
// continue
//}
//result.ExpressCompany[expressRow.ExpressCompanyName]++
//
//expItem.Status = ExpressItemStatusTrue
//result.OrderGoodsID = append(result.OrderGoodsID, orderGoodsDetail.Id)
}
return
}