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.

982 lines
25 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 cron
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"log"
"recook/configs"
order3 "recook/internal/api/mobile/order"
"recook/internal/dbc"
order4 "recook/internal/model/order"
"recook/internal/model/user"
"recook/internal/mq"
"recook/internal/mq/model"
"recook/internal/v2/hook"
"recook/internal/v2/lib/jcook"
"recook/internal/v2/lib/shama"
after2 "recook/internal/v2/logic/manage/after"
order2 "recook/internal/v2/logic/manage/order"
"recook/internal/v2/model/recook/after"
goods2 "recook/internal/v2/model/recook/goods"
manage2 "recook/internal/v2/model/recook/manage"
manage "recook/internal/v2/model/recook/order"
"regexp"
"strconv"
"strings"
"time"
"git.oa00.com/go/mysql"
"github.com/golangkit/formatime"
"github.com/robfig/cron/v3"
"github.com/shopspring/decimal"
gorm2 "gorm.io/gorm"
)
// Task 定时任务
func Task(c *cron.Cron) {
c.AddFunc("0 */1 * * * ?", func() {
fmt.Println("task live")
})
c.AddFunc("0 */10 * * * ?", func() {
NoticeDelete()
})
//_ = c.AddFunc("0 */1 * * * ?", func() {
// message.DeliveryTimeOut()
//})
c.AddFunc("0 */1 * * * ?", func() {
order3.PlanMonitorTradeSucOrderTask()
})
c.AddFunc("0 */1 * * * ?", func() {
order3.PlanMonitorExpireOrderTask()
})
c.AddFunc("0 */1 * * * ?", func() {
AfterNotToDoTwo()
})
c.AddFunc("*/10 * * * * ?", func() {
VipExpired()
})
if configs.IsProductionEnv() {
go TaskMq()
}
// 启动供应链任务
if configs.IsProductionEnv() {
SupplyTask.run()
}
if configs.IsProductionEnv() {
//go ShaMaMq()
}
}
func VipExpired() {
var u1 []user.Information
mysql.Db.Find(&u1, "vip_upgrade_end < ?", time.Now())
for _, v := range u1 {
mysql.Db.Table((&user.Information{}).TableName()).Where("id = ?", v.ID).Updates(map[string]interface{}{
"level": v.OldLevel,
"parent_id": v.OldParentID,
"old_level": 0,
"old_root_id": 0,
"old_parent_id": 0,
"is_offline": false,
"vip_upgrade_start": sql.NullTime{},
"vip_upgrade_end": sql.NullTime{},
})
}
}
func ShaMaMq() {
go OrderShaMaPay()
go OrderShaMaCancel()
go OrderShaMaStockOut()
go ShaMaSkuPrice()
}
func TaskMq() {
go skuChange()
go skuPrice()
go orderCreate()
go OrderPay()
go OrderStockOut()
go OrderFinished()
go OrderCancel()
}
const maxRetryNum = 1
func ShaMaSkuPrice() {
q := fmt.Sprintf("sku.price.queue.%s", configs.ConfigShaMaAppKey)
mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error {
client := shama.GetClient()
var m model.SkuChange
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
rq := shama.SkuDetailReq{
SkuIDSet: []uint{m.SkuID},
}
var res []shama.SkuDetailResp
if err := client.Exec(rq, &res); err != nil {
log.Println(err.Error())
return err
}
if len(res) == 0 {
return nil
}
t := res[0]
var sku goods2.RecookGoodsSkuModel
if err := mysql.Db.Table(sku.TableName()).Where("third_party_sku_id = ? and third_party_type=4", t.SkuDetailBase.SkuID).Updates(map[string]interface{}{
"sale_purchase_price": t.SkuDetailBase.SupplyPrice,
}).Error; err != nil {
log.Println(err.Error())
return err
}
return nil
})
}
func OrderShaMaStockOut() {
q := fmt.Sprintf("order.stock.out.queue.%s", configs.ConfigShaMaAppKey)
mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error {
var m model.OrderStockOutMessage
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
var od manage.RecookOrderInfoModel
if err = mysql.Db.First(&od, "shama_order_id = ?", m.OrderID).Error; err != nil {
log.Println(err.Error())
return err
}
if od.OrderType == 2 {
return nil
}
var orderSku []manage.RecookOrderGoodsDetailModel
if err = mysql.Db.Find(&orderSku, "order_id =? ", od.Id).Error; err != nil {
log.Println(err.Error())
return err
}
ep := make([]order2.ExpressInfo, 0)
for _, v := range m.Packages {
ep = append(ep, order2.ExpressInfo{
ExpressCompName: v.LogisticsName,
ExpressNo: v.WaybillCode,
})
}
for index, j := range orderSku {
order2.Expresslogic.Express(j.VendorId, "jcook", orderSku[index], ep)
}
return nil
})
}
func OrderShaMaPay() {
q := fmt.Sprintf("order.pay.queue.%s", configs.ConfigShaMaAppKey)
mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error {
time.Sleep(time.Second)
var m model.OrderPayMessage
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
var od manage.RecookOrderInfoModel
if err = mysql.Db.First(&od, "shama_order_id = ?", m.OrderID).Error; err != nil {
log.Println(err.Error())
return nil
}
if od.Status == 0 {
return errors.New("订单未支付")
}
if od.Status == 1 {
client := shama.GetClient()
req := shama.OrderPushReq{
OrderID: uint(m.OrderID),
}
var resp jcook.OrderPushResp
if err = client.Exec(req, &resp); err != nil {
return err
}
}
return nil
})
}
func OrderShaMaCancel() {
q := fmt.Sprintf("order.cancel.queue.%s", configs.ConfigShaMaAppKey)
mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error {
var m model.OrderCancelMessage
err := json.Unmarshal(data, &m)
var od manage.RecookOrderInfoModel
if err = mysql.Db.First(&od, "shama_order_id = ?", m.OrderID).Error; err != nil {
if err != gorm2.ErrRecordNotFound {
log.Println(err.Error())
return err
} else {
return nil
}
}
switch m.Status {
case 1:
if od.Status == 0 {
// 未支付订单直接取消
return nil
} else {
tx := dbc.DB.Begin()
{
var asGoods []after.RecookAfterSalesGoodsModel
tx.Find(&asGoods, "order_id = ?", od.Id)
for _, v := range asGoods {
if v.RefundStatus == 1 {
continue
}
t := &after2.UpdateOrderCheckStatusReq{
AsID: v.Id,
}
if err = after2.Refund(tx, v, od, t, manage2.RecookManageUserInfoModel{}); err != nil {
tx.Rollback()
return err
}
}
}
if err = tx.Model(od).Update("deal_status", 11).Error; err != nil {
return err
}
tx.Commit()
}
case 2:
tx := dbc.DB.Begin()
{
od.DealStatus = 12
if err = tx.Save(&od).Error; err != nil {
return err
}
var asGoods []after.RecookAfterSalesGoodsModel
if err = tx.Find(&asGoods, "order_id = ?", od.Id).Error; err != nil {
return err
}
for _, v := range asGoods {
if err = tx.Model(v).Updates(after.RecookAfterSalesGoodsModel{
ReturnStatus: 2,
RejectReason: "系统自动拒绝",
FinishTime: formatime.NewSecondNow(),
}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Model(&manage.RecookOrderGoodsDetailModel{Id: v.OrderGoodsId}).Updates(map[string]interface{}{
"ass_type": 0,
}).Error; err != nil {
tx.Rollback()
return err
}
//这里插入日志
Log1 := after.RecookAfterSalesLogsModel{
AsID: v.Id,
Title: "平台拒绝退款",
Content: "拒绝买家退款申请,如有疑问,请联系客服",
CTime: formatime.NewSecondNow(),
User: "系统",
UserId: 0,
}
tx.Create(&Log1)
Log2 := after.RecookAfterSalesLogsModel{
AsID: v.Id,
Title: "退款关闭",
Content: "系统自动关闭",
CTime: formatime.NewSecondNow(),
User: "系统",
UserId: 0,
}
tx.Create(&Log2)
}
}
tx.Commit()
}
return nil
})
}
func OrderCancel() {
q := fmt.Sprintf("order.cancel.queue.%s", configs.ConfigJCookAppKey)
mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error {
var m model.OrderCancelMessage
err := json.Unmarshal(data, &m)
var od manage.RecookOrderInfoModel
if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil {
if err != gorm2.ErrRecordNotFound {
log.Println(err.Error())
return err
} else {
return nil
}
}
switch m.Status {
case 1:
if od.Status == 0 {
// 未支付订单直接取消
return nil
} else {
tx := dbc.DB.Begin()
{
var asGoods []after.RecookAfterSalesGoodsModel
tx.Find(&asGoods, "order_id = ?", od.Id)
for _, v := range asGoods {
if v.RefundStatus == 1 {
continue
}
t := &after2.UpdateOrderCheckStatusReq{
AsID: v.Id,
}
if err = after2.Refund(tx, v, od, t, manage2.RecookManageUserInfoModel{}); err != nil {
tx.Rollback()
return err
}
}
}
if err = tx.Model(od).Update("deal_status", 11).Error; err != nil {
return err
}
tx.Commit()
}
case 2:
tx := dbc.DB.Begin()
{
od.DealStatus = 12
if err = tx.Save(&od).Error; err != nil {
return err
}
var asGoods []after.RecookAfterSalesGoodsModel
if err = tx.Find(&asGoods, "order_id = ?", od.Id).Error; err != nil {
return err
}
for _, v := range asGoods {
if err = tx.Model(v).Updates(after.RecookAfterSalesGoodsModel{
ReturnStatus: 2,
RejectReason: "系统自动拒绝",
FinishTime: formatime.NewSecondNow(),
}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Model(&manage.RecookOrderGoodsDetailModel{Id: v.OrderGoodsId}).Updates(map[string]interface{}{
"ass_type": 0,
}).Error; err != nil {
tx.Rollback()
return err
}
//这里插入日志
Log1 := after.RecookAfterSalesLogsModel{
AsID: v.Id,
Title: "平台拒绝退款",
Content: "拒绝买家退款申请,如有疑问,请联系客服",
CTime: formatime.NewSecondNow(),
User: "系统",
UserId: 0,
}
tx.Create(&Log1)
Log2 := after.RecookAfterSalesLogsModel{
AsID: v.Id,
Title: "退款关闭",
Content: "系统自动关闭",
CTime: formatime.NewSecondNow(),
User: "系统",
UserId: 0,
}
tx.Create(&Log2)
}
}
tx.Commit()
}
return nil
})
}
func OrderFinished() {
q := fmt.Sprintf("order.finished.queue.%s", configs.ConfigJCookAppKey)
mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error {
var m model.OrderFinishMessage
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
var od order4.Information
if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil {
log.Println(err.Error())
return err
}
od.JCookStatus = 1
if err = mysql.Db.Save(od).Error; err != nil {
log.Println(err.Error())
return err
}
return nil
})
}
func OrderStockOut() {
q := fmt.Sprintf("order.stock.out.queue.%s", configs.ConfigJCookAppKey)
mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error {
var m model.OrderStockOutMessage
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
var od manage.RecookOrderInfoModel
if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil {
log.Println(err.Error())
return err
}
var orderSku []manage.RecookOrderGoodsDetailModel
if err = mysql.Db.Find(&orderSku, "order_id =? ", od.Id).Error; err != nil {
log.Println(err.Error())
return err
}
ep := make([]order2.ExpressInfo, 0)
for _, v := range m.Packages {
ep = append(ep, order2.ExpressInfo{
ExpressCompName: v.LogisticsName,
ExpressNo: v.WaybillCode,
})
}
for index, j := range orderSku {
if j.ExpressStatus == manage.RecookOrderGoodsDetailExpressStatusTrue {
continue
}
if err := order2.Expresslogic.Express(j.VendorId, "jcook", orderSku[index], ep); err != nil {
return err
}
}
return nil
})
}
func OrderPay() {
q := fmt.Sprintf("order.pay.queue.%s", configs.ConfigJCookAppKey)
mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error {
time.Sleep(time.Second)
var m model.OrderPayMessage
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
var od manage.RecookOrderInfoModel
if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil {
log.Println(err.Error())
return nil
}
if od.Status == 0 {
return errors.New("订单未支付")
}
if od.Status == 1 {
client := jcook.GetClient()
req := jcook.OrderPushReq{
OrderID: uint(m.OrderID),
}
var resp jcook.OrderPushResp
if err = client.Exec(req, &resp); err != nil {
return err
}
}
return nil
})
}
func orderCreate() {
q := fmt.Sprintf("order.create.queue.%s", configs.ConfigJCookAppKey)
mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error {
var m model.OrderCreateMessage
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
if m.RootOrderID != 0 {
// 发生拆单.
var rod manage.RecookOrderInfoModel
if err := mysql.Db.Preload("OrderSku").First(&rod, "jcook_order_id = ?", m.RootOrderID).Error; err != nil {
return err
}
var pod manage.RecookOrderInfoModel
if err := mysql.Db.Preload("OrderSku").First(&pod, "jcook_order_id = ?", m.ParentOrderID).Error; err != nil {
return err
}
if err := mysql.Db.Transaction(func(tx *gorm2.DB) error {
rod.IsSplit = true
rod.Status = 3
tx.Save(&rod)
pod.IsSplit = true
pod.Status = 3
tx.Save(&pod)
if err := tx.Table((&order4.Profit{}).TableName()).Where("order_id = ?", rod.Id).Update("status", 1).Error; err != nil {
return err
}
if err := tx.Table((&order4.Profit{}).TableName()).Where("order_id = ?", pod.Id).Update("status", 1).Error; err != nil {
return err
}
var ids []uint64
for _, v := range m.SkuList {
ids = append(ids, v.SkuID)
}
var orderSku []manage.RecookOrderGoodsDetailModel
var sku []goods2.RecookGoodsSkuModel
sub := tx.Select("id").Find(&sku, "third_party_sku_id in (?)", ids)
if err := tx.Find(&orderSku, "sku_id in (?) AND order_id = ?", sub, rod.Id).Error; err != nil {
log.Println(err.Error())
return err
}
// 拆分拆单运费
unit := m.FreightFee.Div(decimal.NewFromInt(int64(len(orderSku)))).Round(2)
fee := m.FreightFee
unitMap := make(map[uint]decimal.Decimal)
var orderSkuNew []manage.RecookOrderGoodsDetailModel
for i := 0; i < len(orderSku); i++ {
if i == len(orderSku)-1 {
unitMap[orderSku[i].SkuId] = fee
break
}
fee = fee.Sub(unit)
unitMap[orderSku[i].SkuId] = unit
}
coinTotal := decimal.Zero
goodsTotalAmount := decimal.Zero
goodsTotalCommission := decimal.Zero
actualAmount := decimal.Zero
for _, v := range orderSku {
actualAmount = actualAmount.Add(v.GoodsAmount).Add(unitMap[v.SkuId]).Sub(v.CoinAmount)
coinTotal = coinTotal.Add(v.CoinAmount)
goodsTotalAmount = goodsTotalAmount.Add(v.GoodsAmount)
}
orderNew := manage.RecookOrderInfoModel{
AncestorId: rod.AncestorId,
ParentId: rod.ParentId,
SharerId: rod.SharerId,
LiveId: rod.LiveId,
UserId: rod.UserId,
UserRole: rod.UserRole,
Title: "",
CoinTotalAmount: coinTotal,
ExpressTotalFee: m.FreightFee,
GoodsTotalAmount: goodsTotalAmount,
GoodsTotalCommission: goodsTotalCommission,
ActualTotalAmount: actualAmount,
Channel: rod.Channel,
ShippingMethod: rod.ShippingMethod,
StoreId: rod.StoreId,
BuyerMessage: rod.BuyerMessage,
Status: 1,
ExpressStatus: rod.ExpressStatus,
InvoiceStatus: rod.InvoiceStatus,
CreatedAt: rod.CreatedAt,
ExpireTime: rod.ExpireTime,
PayIP: rod.PayIP,
TradeNo: rod.TradeNo,
PayTime: rod.PayTime,
PayMethod: rod.PayMethod,
RbacId: rod.RbacId,
IsFirst: rod.IsFirst,
VirtualID: rod.VirtualID,
PayType: rod.PayType,
Kind: rod.Kind,
JCookOrderID: uint(m.OrderID),
JCookRootID: uint(m.RootOrderID),
JCookParentID: uint(m.ParentOrderID),
OrderType: rod.OrderType,
}
var orderAddr manage.RecookOrderAddrModel
tx.First(&orderAddr, "order_id = ?", rod.Id)
if err := tx.Create(&orderNew).Error; err != nil {
log.Println(err.Error())
return err
}
orderAddr.Id = 0
orderAddr.OrderId = orderNew.Id
if err := tx.Create(&orderAddr).Error; err != nil {
log.Println(err.Error())
return err
}
cost := decimal.Zero
total := decimal.Zero
for _, v := range orderSku {
cost = cost.Add(v.PurchasePrice).Mul(decimal.NewFromInt(int64(v.Quantity)))
total = total.Add(v.GoodsAmount)
v.Id = 0
v.OrderId = orderNew.Id
v.ExpressFee = unitMap[v.SkuId]
//v.CoinAmount = decimal.Zero
v.ActualAmount = v.GoodsAmount.Add(v.ExpressFee).Sub(v.CoinAmount)
//coinTotal = decimal.Zero
orderSkuNew = append(orderSkuNew, v)
}
//orderNew.CoinTotalAmount = coinTotal
if err = tx.Save(orderNew).Error; err != nil {
log.Println(err.Error())
return err
}
if err = tx.Create(orderSkuNew).Error; err != nil {
log.Println(err.Error())
return err
}
var rp []order4.Profit
if err := tx.Table((&order4.Profit{}).TableName()).Find(&rp, "order_id = ?", rod.Id).Error; err != nil {
return err
}
profitNew := make([]*order4.Profit, 0)
b2 := decimal.Zero
for _, k := range orderSkuNew {
b2 = b2.Add(k.GetBase().Mul(decimal.NewFromInt(int64(k.Quantity))))
}
for _, v := range rp {
temp := order4.CreateProfit(v.UserID, v.Type, b2, orderNew.Id)
profitNew = append(profitNew, temp)
}
if len(profitNew) != 0 {
if err = tx.Create(profitNew).Error; err != nil {
log.Println(err.Error())
return err
}
}
return nil
}); err != nil {
return err
}
}
return nil
})
}
func skuPrice() {
q := fmt.Sprintf("sku.price.queue.%s", configs.ConfigJCookAppKey)
mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error {
client := jcook.GetClient()
var m model.SkuChange
err := json.Unmarshal(data, &m)
if err != nil {
log.Println(err.Error())
return err
}
rq := jcook.SkuPriceReq{
SkuIDSet: []uint{m.SkuID},
}
var res []jcook.SkuPriceResp
if err := client.Exec(rq, &res); err != nil {
log.Println(err.Error())
return err
}
if len(res) == 0 {
return nil
}
t := res[0]
var sku goods2.RecookGoodsSkuModel
if err := mysql.Db.Table(sku.TableName()).Where("third_party_sku_id = ? and third_party_type=3", t.SkuID).Updates(map[string]interface{}{
"purchase_price": t.SupplyPrice,
}).Error; err != nil {
log.Println(err.Error())
return err
}
return nil
})
}
func skuChange() {
q := fmt.Sprintf("sku.change.queue.%s", configs.ConfigJCookAppKey)
mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error {
client := jcook.GetClient()
var m model.SkuChange
_ = json.Unmarshal(data, &m)
rq := jcook.SkuDetailReq{
SkuIDSet: []uint{m.SkuID},
}
var gsk goods2.RecookGoodsSkuModel
if err := mysql.Db.First(&gsk, "third_party_sku_id = ? AND third_party_type = 3 ", strconv.Itoa(int(m.SkuID))).Error; err != nil {
if err == gorm2.ErrRecordNotFound {
return nil
}
log.Println(err.Error())
return err
}
var res []jcook.SkuDetailResp
if err := client.Exec(rq, &res); err != nil {
return err
}
if len(res) == 0 {
return nil
}
if err := mysql.Db.Transaction(func(tx *gorm2.DB) error {
patch := res[0]
var pu uint
if patch.SkuDetailBase.Yn && patch.SkuDetailBase.Status {
pu = 1
} else {
pu = 0
}
p1 := map[string]interface{}{}
p1["inventory"] = 500
if pu == 0 {
p1["inventory"] = 0
}
name := strings.Trim(strings.Join([]string{patch.SkuDetailBase.Color, patch.SkuDetailBase.Size}, "+"), "+")
if name == "" {
name = "标准"
}
if name != gsk.Name {
p1["name"] = name
combineID := strings.Split(gsk.CombineId, ",")
for index, s1 := range combineID {
sid, _ := strconv.Atoi(s1)
if index == 0 {
tx.Model(&goods2.RecookGoodsAttributeModel{Id: uint(sid)}).Update("value", patch.SkuDetailBase.Color)
} else {
tx.Model(&goods2.RecookGoodsAttributeModel{Id: uint(sid)}).Update("value", patch.SkuDetailBase.Size)
}
}
}
if err := tx.Model(&gsk).Updates(p1).Error; err != nil {
return err
}
if p1["inventory"] == 0 {
var other []goods2.RecookGoodsSkuModel
tx.Find(&other, "goods_id = ?", gsk.GoodsId)
flag := 1
for _, v := range other {
if v.Inventory != 0 {
flag = 0
break
}
}
if flag == 1 {
tx.Table((&goods2.RecookGoodsInfoModel{}).TableName()).
Where("id = ?", gsk.GoodsId).
Update("publish_status", 0)
}
} else {
// tx.Table((&goods2.RecookGoodsInfoModel{}).TableName()).Where("id = ?", gsk.GoodsId).Update("publish_status", 1)
}
if err := tx.Table((&goods2.RecookGoodsSkuModel{}).TableName()).Where("id = ?", gsk.Id).
Update("pic_url", patch.SkuDetailBase.MainPhoto).Error; err != nil {
return err
}
if err := tx.Delete(&goods2.RecookGoodsMainPhotoModel{}, "goods_id = ?", gsk.GoodsId).Error; err != nil {
return err
}
if err := tx.Delete(&goods2.RecookGoodsDetailPhotoModel{}, "goods_id = ?", gsk.GoodsId).Error; err != nil {
return err
}
mp := make([]goods2.RecookGoodsMainPhotoModel, 0)
dp := make([]goods2.RecookGoodsDetailPhotoModel, 0)
if len(patch.Images) == 1 {
mp = append(mp, goods2.RecookGoodsMainPhotoModel{
GoodsId: gsk.GoodsId,
Url: patch.Images[0].Url,
IsMaster: 0,
Name: "api",
OrderNo: 1,
Width: 0,
Height: 0,
})
}
for ki, k := range patch.Images {
master := 0
if k.IsPrimer {
master = 1
}
mp = append(mp, goods2.RecookGoodsMainPhotoModel{
GoodsId: gsk.GoodsId,
Url: k.Url,
IsMaster: master,
Name: "api",
OrderNo: ki,
Width: 0,
Height: 0,
})
}
reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"")
result := reg.FindAllStringSubmatch(patch.BigInfo.PcWDis, -1)
for ki, k := range result {
kt := k[1]
if len(strings.TrimSpace(kt)) == 0 {
if len(k) > 2 {
kt = k[2]
}
}
if len(strings.TrimSpace(kt)) == 0 || len(strings.TrimSpace(kt)) > 255 || len(strings.TrimSpace(kt)) < 25 {
continue
}
kt = strings.Trim(kt, "\\")
if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") {
kt = "http:" + kt
}
dp = append(dp, goods2.RecookGoodsDetailPhotoModel{
GoodsID: gsk.GoodsId,
Url: kt,
Name: "api",
OrderNo: ki,
Width: 0,
Height: 0,
})
}
if len(mp) > 0 {
if err := tx.Create(&mp).Error; err != nil {
log.Println(err.Error())
return err
}
}
if len(dp) > 0 {
if err := tx.Create(&dp).Error; err != nil {
log.Println(err.Error())
return err
}
}
return nil
}); err != nil {
log.Println(err.Error())
return err
}
return nil
})
}
func NoticeDelete() {
log.Println("清理商详")
var data []goods2.RecookGoodsNoticeModel
if err := dbc.DB.Table((&goods2.RecookGoodsNoticeModel{}).TableName()).Find(&data).Error; err != nil {
log.Println("task error: ", err.Error())
return
}
for _, v := range data {
if v.EndTime.Time.Before(time.Now()) {
var temp goods2.RecookGoodsNoticeGoodsModel
if err := dbc.DB.Delete(&temp, "notice_id = ?", v.Id).Error; err != nil {
log.Println("task error: ", err.Error())
continue
}
if err := dbc.DB.Delete(&v).Error; err != nil {
log.Println("task error: ", err.Error())
continue
}
}
}
}
//48小时自动关闭未填写单号的售后
var days1 time.Duration = 2
type updateReturnSuccessParam struct {
AsID uint `json:"asId" binding:"required"`
Opinion uint `json:"opinion"` // 1同意退款退货 2拒绝
RejectReason string `json:"rejectReason"`
}
// AfterNotToDoTwo 买家没有填写单号
func AfterNotToDoTwo() {
t := time.Now().Add(time.Hour * 72 * -days1)
var afterSales []after.RecookAfterSalesGoodsModel
dbc.DB.Find(&afterSales, "return_status = 3 AND ass_type=2 AND check_time <= ?", t.Format("2006-01-02 15:04:05"))
for _, v := range afterSales {
var p updateReturnSuccessParam
p = updateReturnSuccessParam{
v.Id,
2,
"72小时未填写单号系统自动关闭",
}
UpdateNotExp(p, v)
}
}
// UpdateNotExp 没有填写单号,退货被拒绝
func UpdateNotExp(p updateReturnSuccessParam, asGoods after.RecookAfterSalesGoodsModel) {
var orderInfo manage.RecookOrderInfoModel
if err := dbc.DB.First(&orderInfo, asGoods.OrderId).Error; err != nil {
return
}
if p.Opinion == 2 {
tx := mysql.Db.Begin()
{
if err := tx.Model(&asGoods).Updates(&after.RecookAfterSalesGoodsModel{
ReturnStatus: 6,
RejectReason: p.RejectReason,
FinishTime: formatime.NewSecondNow(),
IsClosed: 1,
}).Error; err != nil {
tx.Rollback()
return
}
if err := tx.Model(&manage.RecookOrderGoodsDetailModel{Id: asGoods.OrderGoodsId}).Updates(map[string]interface{}{
"ass_type": 0,
"is_closed": 1,
}).Error; err != nil {
tx.Rollback()
return
}
if err := hook.AfterHook.Close(&asGoods); err != nil {
tx.Rollback()
return
}
}
tx.Commit()
}
}