From c55847dda025fa2ac9d53f7c5dae6d8678a1228a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Tue, 16 Sep 2025 14:22:34 +0800 Subject: [PATCH] 1 --- business/jxcallback/orderman/orderman_ext.go | 2 +- business/jxstore/cms/sku.go | 5 +- business/model/api_config.go | 8 ++ business/model/dao/invoice_dao.go | 32 ++++++- business/model/dao/store_sku.go | 5 +- business/model/invoice_msg.go | 3 + business/model/sku.go | 1 + business/partner/partner_store_sku.go | 2 + business/partner/purchase/ebai/callback.go | 2 + business/partner/purchase/ebai/im.go | 83 ++++++++++++++++++- business/partner/purchase/ebai/order.go | 13 +++ business/partner/purchase/ebai/store.go | 65 +++++++++++++++ business/partner/purchase/ebai/store_sku2.go | 6 ++ business/partner/purchase/elm/order.go | 5 ++ business/partner/purchase/jd/order.go | 5 ++ business/partner/purchase/jd/sku2.go | 4 +- business/partner/purchase/jdshop/order.go | 5 ++ business/partner/purchase/jx/order.go | 7 +- business/partner/purchase/mtwm/callback.go | 1 + business/partner/purchase/mtwm/order.go | 6 +- business/partner/purchase/mtwm/store_sku2.go | 11 +++ .../partner/purchase/tao_vegetable/order.go | 5 ++ .../purchase/tao_vegetable/store_sku2.go | 4 +- .../partner/purchase/tiktok_store/order.go | 5 ++ business/partner/purchase/yb/order.go | 5 ++ controllers/cms_sku.go | 15 ++++ controllers/jx_order.go | 78 ++++++++++++++++- controllers/mtwm_callback.go | 2 +- routers/commentsRouter_controllers.go | 37 +++++++++ 29 files changed, 401 insertions(+), 21 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 8cee2e8dc..6b047e890 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -1207,7 +1207,7 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID fineList, _ := dao.StatisticsFineFee(db, fromTime, toTime, storeIDList) for _, v := range saleInfoList { for _, f := range feeList { - if v.StoreID == f.JxStoreID && v.VendorID == f.VendorID { + if v.StoreID == f.JxStoreID && v.VendorID == f.VendorID && v.Status == model.OrderStatusFinished { v.ServerFee = f.ServerFee } } diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 0b8938cc9..b0cfc0808 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -656,7 +656,8 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric t1.mt_attribute, t1.qua_pictures, t1.qua_effective_date, - t1.qua_approval_date + t1.qua_approval_date, + t1.special_pictures ` if isBySku { sqlData += " ,t2.id sku_id" @@ -3471,6 +3472,7 @@ func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs [ t1.qua_pictures, t1.qua_effective_date, t1.qua_approval_date, + t1.special_pictures, t1.best_seller FROM sku_name t1 LEFT JOIN sku t2 ON t1.id = t2.name_id AND t2.deleted_at = ? @@ -3516,6 +3518,7 @@ func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs [ t1.qua_pictures, t1.qua_effective_date, t1.qua_approval_date, + t1.special_pictures, t2.id sku_id FROM sku_name t1 LEFT JOIN sku t2 ON t1.id = t2.name_id AND t2.deleted_at = ? diff --git a/business/model/api_config.go b/business/model/api_config.go index b567955b6..50d3047a4 100644 --- a/business/model/api_config.go +++ b/business/model/api_config.go @@ -72,6 +72,14 @@ const ( AlarmFee = 1500 // 配送费报警阈值 ) +const ( + InvoiceStatusInit = "1" // INIT-初始化,未受理 + InvoiceStatusFailUre = "2" // APPLY_FAILURE-申请受理失败 + InvoiceStatusBilling = "3" // 开具中 + InvoiceStatusBillingSuccess = "4" // 开具成功 + InvoiceStatusBillingFail = "5" // 开具失败 +) + type VendorInfo struct { Name string `json:"name"` diff --git a/business/model/dao/invoice_dao.go b/business/model/dao/invoice_dao.go index 3af00b243..c019d49af 100644 --- a/business/model/dao/invoice_dao.go +++ b/business/model/dao/invoice_dao.go @@ -1,6 +1,7 @@ package dao import ( + "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" @@ -9,12 +10,12 @@ import ( func GetInvoiceInfo(db *DaoDB, vendorOrderId string) (*model.InvoiceMsg, error) { data := &model.InvoiceMsg{} - sql := ` SELECT * FROM invoice_msg WHERE order_id = ? ` - err := GetRow(db, data, sql, []interface{}{vendorOrderId}...) + sql := ` SELECT * FROM invoice_msg WHERE order_id = ? OR remark LIKE ?` + err := GetRow(db, data, sql, []interface{}{vendorOrderId, "%" + fmt.Sprintf("%s", vendorOrderId) + "%"}...) return data, err } -func GetStoreInvoiceList(storeID int, startTime, endTime time.Time, status string, offset, pageSize int) (info *model.PagedInfo, err error) { +func GetStoreInvoiceList(storeID, vendorId int, startTime, endTime time.Time, status string, offset, pageSize int) (info *model.PagedInfo, err error) { parameter := []interface{}{} sql := ` SELECT * FROM invoice_msg WHERE 1=1 ` if storeID != 0 { @@ -29,6 +30,10 @@ func GetStoreInvoiceList(storeID int, startTime, endTime time.Time, status strin sql += ` AND created_at <= ? ` parameter = append(parameter, endTime) } + if vendorId != 0 { + sql += ` AND vendor_id = ? ` + parameter = append(parameter, vendorId) + } if status != "" { switch status { case "1": // 未回复 @@ -53,3 +58,24 @@ func GetStoreInvoiceList(storeID int, startTime, endTime time.Time, status strin return nil, err } + +func GetInvoiceInfoByTaskId(db *DaoDB, taskId string) (*model.InvoiceMsg, error) { + data := &model.InvoiceMsg{} + sql := ` SELECT * FROM invoice_msg WHERE invoice_task_id = ?` + err := GetRow(db, data, sql, []interface{}{taskId}...) + return data, err +} + +func GetInvoiceByStoreId(db *DaoDB, storeId, vendorId int) ([]*model.InvoiceMsg, error) { + param := []interface{}{} + data := make([]*model.InvoiceMsg, 0, 0) + sql := ` SELECT * FROM invoice_msg WHERE store_id = ? ` + param = append(param, storeId) + if vendorId != 0 { + sql += ` AND vendor_id = ?` + param = append(param, vendorId) + + } + err := GetRows(db, data, sql, param...) + return data, err +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 439f25791..c425289ed 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -131,6 +131,7 @@ type StoreSkuSyncInfo struct { QuaPictures string // 资质图片 QuaEffectiveDate int64 // 资质有效期 QuaApprovalDate int64 // 批准日期 + SpecialPictures string // 商品扩展规则(营业成分) VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) CategoryName string `json:"categoryName"` //分类名 @@ -591,7 +592,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo %s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,t1.vendor_son_sku_id,t1.vendor_sku_attr_id,t1.vendor_main_id, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t1.stock, t1.mt_ladder_box_price,t1.location_code, t2.*, - t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix,t3.tiktok_attribute,t3.mt_attribute,t3.qua_pictures,t3.qua_effective_date,t3.qua_approval_date, + t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix,t3.tiktok_attribute,t3.mt_attribute,t3.qua_pictures,t3.qua_effective_date,t3.qua_approval_date,t3.special_pictures, t3.sell_point,t3.sell_point_times,t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin,t3.upc_brand_name,t3.upc_tiktok_brand_id, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, @@ -722,7 +723,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf t1.store_id, t1.deleted_at bind_deleted_at, t1.stock,t1.location_code, t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_sku_id, t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id,t3.tiktok_attribute, - t3.mt_attribute,t3.qua_pictures,t3.qua_effective_date,t3.qua_approval_date,t3.sell_point,t3.sell_point_times,t3.upc_brand_name,t3.upc_tiktok_brand_id, + t3.mt_attribute,t3.qua_pictures,t3.qua_effective_date,t3.qua_approval_date,t3.special_pictures,t3.sell_point,t3.sell_point_times,t3.upc_brand_name,t3.upc_tiktok_brand_id, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img, diff --git a/business/model/invoice_msg.go b/business/model/invoice_msg.go index 6246c7fc9..7680307e7 100644 --- a/business/model/invoice_msg.go +++ b/business/model/invoice_msg.go @@ -6,6 +6,7 @@ type InvoiceMsg struct { StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid VendorID int `orm:"column(vendor_id);size(2)" json:"vendorID"` // 平台ID InvoiceTaskId string `orm:"column(invoice_task_id);size(64)" json:"invoiceTaskId"` // 任务ID + Status string `orm:"column(status);size(8)" json:"status"` // 发票状态 INIT-初始化,未受理 1 APPLY_FAILURE-申请受理失败 2 BILLING-开具中 3 BILLING_SUCCESS-开具成功 4 BILLING_FAILURE- 开具失败 5 PushType int `orm:"column(push_type);size(2)" json:"pushType"` // 消息类型,1-开发票,3-催发票 InvoiceTitle string `orm:"column(invoice_title);size(256)" json:"invoiceTitle"` // 发票抬头,为用户填写的开发票的抬头。 TaxpayerId string `orm:"column(taxpayer_id);size(32)" json:"taxpayerId"` // 纳税人识别号 @@ -18,6 +19,7 @@ type InvoiceMsg struct { InvoiceAmount int64 `orm:"column(invoice_amount);size(16)" json:"invoiceAmount"` // 商家开票金额,单位分 InvoiceUrl string `orm:"column(invoice_url);size(512)" json:"invoiceUrl"` // 发票文件链接 InvoiceId string `orm:"column(invoice_id);size(32)" json:"invoiceId"` // 发票号码 + Remark string `orm:"column(remark);size(512)" json:"remark"` // 备注 } func (o *InvoiceMsg) TableUnique() [][]string { @@ -27,5 +29,6 @@ func (o *InvoiceMsg) TableIndex() [][]string { return [][]string{ []string{"CreatedAt", "StoreID"}, []string{"OrderId"}, + []string{"InvoiceTaskId"}, } } diff --git a/business/model/sku.go b/business/model/sku.go index 05b12ee3b..2bf76b5f1 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -196,6 +196,7 @@ type SkuName struct { QuaPictures string `orm:"column(qua_pictures);size(512)" json:"quaPictures"` // 商品资质图片,非必填,医疗器械必须传,保健食品、特殊医学配方食品建议传 QuaEffectiveDate int64 `orm:"column(qua_effective_date)" json:"quaEffectiveDate"` // 商品资质有效期,传10位秒级的时间戳。-1:永久有效。 QuaApprovalDate int64 `orm:"column(qua_approval_date)" json:"quaApprovalDate"` // 批准日期,格式为10位秒级的时间戳。 + SpecialPictures string `orm:"column(special_pictures);type(text)" json:"specialPictures"` // 批准日期,格式为10位秒级的时间戳。 } func (*SkuName) TableUnique() [][]string { diff --git a/business/partner/partner_store_sku.go b/business/partner/partner_store_sku.go index 0a9e209e4..ec4b254b6 100644 --- a/business/partner/partner_store_sku.go +++ b/business/partner/partner_store_sku.go @@ -171,6 +171,8 @@ type IPurchasePlatformStoreSkuHandler interface { // GetVendorAllSkuList 同平台商品复制(饿了么复制饿了么,美团复制美团),获取商品 + // UploadInvoice 发票回复 + UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) } type ISingleStoreStoreSkuHandler interface { diff --git a/business/partner/purchase/ebai/callback.go b/business/partner/purchase/ebai/callback.go index c581e6175..bbda6c0d9 100644 --- a/business/partner/purchase/ebai/callback.go +++ b/business/partner/purchase/ebai/callback.go @@ -35,6 +35,8 @@ func OnCallbackMsg(msg *ebaiapi.CallbackMsg) (response *ebaiapi.CallbackResponse response = api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, msg.Cmd) } else if msg.Cmd == ebaiapi.CmdImMessageSendEvent /*|| msg.Cmd == ebaiapi.CmdImMessageReadEvent*/ { response = CurPurchaseHandler.OnImMessage(msg) + } else if msg.Cmd == ebaiapi.CmdImInvoicApply || msg.Cmd == ebaiapi.CmdImInvoicEmail { + response = CurPurchaseHandler.InvoiceApply(msg) } } return response diff --git a/business/partner/purchase/ebai/im.go b/business/partner/purchase/ebai/im.go index cd2b2cbda..b7f96b5e3 100644 --- a/business/partner/purchase/ebai/im.go +++ b/business/partner/purchase/ebai/im.go @@ -2,10 +2,16 @@ package ebai import ( "encoding/json" - + "fmt" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner/im" "git.rosy.net.cn/jx-callback/globals/api" + "time" ) const ( @@ -23,6 +29,81 @@ func (p *PurchaseHandler) OnImMessage(msg *ebaiapi.CallbackMsg) (response *ebaia return nil } +// InvoiceApply 用户申请发票 +func (p *PurchaseHandler) InvoiceApply(msg *ebaiapi.CallbackMsg) (response *ebaiapi.CallbackResponse) { + + var ( + db = dao.GetDB() + applyNo = "" + storeId = "" + vendorStoreId = "" + ) + + switch msg.Cmd { + case ebaiapi.CmdImInvoicApply: + invoice := &ebaiapi.InvoiceApplyBody{} + if err := utils.Map2StructByJson(msg.Body, invoice, false); err != nil { + return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, msg.Cmd) + } + invoiceData, _ := dao.GetInvoiceInfo(db, utils.Int64ToStr(invoice.OrderList[0].OrderId)) + applyNo = invoice.ApplicationNo + storeId = invoice.ShopId + vendorStoreId = invoice.BaiduShopId + if invoiceData == nil { + invoiceObj := model.InvoiceMsg{ + ModelIDCUL: model.ModelIDCUL{}, + OrderId: utils.Int64ToStr(invoice.OrderList[0].OrderId), + StoreID: utils.Str2Int(invoice.ShopId), + VendorID: model.VendorIDEBAI, + InvoiceTaskId: invoice.ApplicationNo, + Status: invoice.Status, + PushType: 1, + InvoiceTitle: invoice.BuyerTitle.TitleName, + TaxpayerId: invoice.BuyerTitle.TaxPayerNum, + NeedInvoiceByCategory: 1, + CompanyAddress: invoice.BuyerTitle.RegisterAddress, + CompanyPhone: invoice.BuyerTitle.RegisterPhone, + AccountBank: invoice.BuyerTitle.BankName, + AccountNumber: invoice.BuyerTitle.BankAccount, + Email: invoice.BuyerContact.Email, + InvoiceAmount: utils.Float64TwoInt64(invoice.TotalInvoiceAmount * 100), + InvoiceUrl: "", + InvoiceId: "", + } + if len(invoice.OrderList) > 1 { + orderList := make(map[int64]float64, 0) + for _, v := range invoice.OrderList { + orderList[v.OrderId] = v.InvoiceAmount + } + invoiceObj.Remark = string(utils.MustMarshal(orderList)) + } + dao.WrapAddIDCULEntity(invoiceObj, "system") + if err := dao.CreateEntity(db, invoiceObj); err != nil { + return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, msg.Cmd) + } + } + case ebaiapi.CmdImInvoicEmail: + invoice := &ebaiapi.InvoiceEmailPush{} + if err := utils.Map2StructByJson(msg.Body, invoice, false); err != nil { + return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, msg.Cmd) + } + applyNo = invoice.ApplicationNo + storeId = invoice.ShopId + vendorStoreId = invoice.BaiduShopId + invoiceData, _ := dao.GetInvoiceInfoByTaskId(db, invoice.ApplicationNo) + if invoiceData != nil { + invoiceData.UpdatedAt = time.Now() + invoiceData.Email = invoice.Email + dao.UpdateEntity(db, invoiceData, "UpdatedAt", "Email") + } + } + content2 := fmt.Sprintf("发票单号:%s,用户申请发票,请老板提供发票信息!", applyNo) + if _, err := weixinmsg.SendStoreMessage(jxcontext.AdminCtx, "美团用户申请发票", content2, []int{utils.Str2Int(storeId)}, nil, "", model.MessageTypeStore, true, true); err != nil { + im.PushMsgByCid(vendorStoreId, model.VendorIDEBAI, content2) + } + return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, nil, msg.Cmd) +} + // BusinessSendMsg 向门店发送消息 //func BusinessSendMsg(param *ebaiapi.BusinessSendMsgReq) error { // err := api.EbaiAPI.BusinessSendMsg(param) diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 4fb12ef05..d9c0874c7 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -1074,3 +1074,16 @@ func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (strin } return "", err } + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + goodsOrder, err := partner.CurOrderManager.LoadOrder(param.OrderId, param.VendorID) + if err != nil { + return nil, nil, err + } + result, err := api.EbaiAPI.UploadInvoice(goodsOrder.VendorStoreID, param.InvoiceTaskId, param.InvoiceUrl) + if err != nil { + return nil, nil, err + } + return result.SuccessfulApplicationNoList, result.FailedApplicationNoList, nil +} diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index ebfe6e15b..de03bcc25 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -920,3 +920,68 @@ func (c *PurchaseHandler) UpdateStoreLineStatus(ctx *jxcontext.Context, vendorOr return err } + +// QueryInvoiceSetting 获取门店发票设置 +func QueryInvoiceSetting(baiDuStoreId string) ([]*ebaiapi.SettingList, error) { + return api.EbaiAPI.QueryInvoiceSetting([]string{baiDuStoreId}) +} + +// BathUpdateInvoiceSetting 批量更新门店发票设置 +func BathUpdateInvoiceSetting(baiDuStoreId string, setting *ebaiapi.StoreInvoiceSetting) ([]*ebaiapi.ResultList, []*ebaiapi.ResultList, error) { + return api.EbaiAPI.BathUpdateInvoiceSetting(baiDuStoreId, setting) +} + +// QueryUnansweredInvoice 查询门店未回复发票信息 +func QueryUnansweredInvoice(baiDuStoreId string, jxStoreId int) (*ebaiapi.QueryUnansweredInvoiceResult, error) { + var db = dao.GetDB() + unansweredList, err := api.EbaiAPI.QueryUnansweredInvoice(baiDuStoreId) + if err != nil { + return nil, err + } + + if len(unansweredList.RecordList) != 0 { + invoiceData, _ := dao.GetInvoiceByStoreId(db, jxStoreId, model.VendorIDEBAI) + invoiceDataMap := make(map[string]*model.InvoiceMsg, 0) + for i := 0; i < len(invoiceData); i++ { + invoiceDataMap[invoiceData[i].InvoiceTaskId] = invoiceData[i] + } + for i := 0; i < len(unansweredList.RecordList); i++ { + if invoiceDataMap[unansweredList.RecordList[i].ApplicationNo] != nil { + invoiceDataMap[unansweredList.RecordList[i].ApplicationNo].Status = model.InvoiceStatusInit + dao.UpdateEntity(db, invoiceDataMap[unansweredList.RecordList[i].ApplicationNo], "Status") + } else { + invoiceObj := model.InvoiceMsg{ + ModelIDCUL: model.ModelIDCUL{}, + OrderId: utils.Int64ToStr(unansweredList.RecordList[i].OrderList[0].OrderId), + StoreID: utils.Str2Int(unansweredList.RecordList[i].ShopId), + VendorID: model.VendorIDEBAI, + InvoiceTaskId: unansweredList.RecordList[i].ApplicationNo, + Status: unansweredList.RecordList[i].Status, + PushType: 1, + InvoiceTitle: unansweredList.RecordList[i].BuyerTitle.TitleName, + TaxpayerId: unansweredList.RecordList[i].BuyerTitle.TaxPayerNum, + NeedInvoiceByCategory: 1, + CompanyAddress: unansweredList.RecordList[i].BuyerTitle.RegisterAddress, + CompanyPhone: unansweredList.RecordList[i].BuyerTitle.RegisterPhone, + AccountBank: unansweredList.RecordList[i].BuyerTitle.BankName, + AccountNumber: unansweredList.RecordList[i].BuyerTitle.BankAccount, + Email: unansweredList.RecordList[i].BuyerContact.Email, + InvoiceAmount: utils.Float64TwoInt64(unansweredList.RecordList[i].TotalInvoiceAmount * 100), + InvoiceUrl: "", + InvoiceId: "", + } + if len(unansweredList.RecordList[i].OrderList) > 1 { + orderList := make(map[int64]float64, 0) + for _, v := range unansweredList.RecordList[i].OrderList { + orderList[v.OrderId] = v.InvoiceAmount + } + invoiceObj.Remark = string(utils.MustMarshal(orderList)) + } + dao.WrapAddIDCULEntity(invoiceObj, "system") + dao.CreateEntity(db, invoiceObj) + } + } + } + + return unansweredList, err +} diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index 8c3e7d20b..210d7db34 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -457,6 +457,12 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE "url": storeSku.Img5, }) } + if storeSku.SpecialPictures != "" { + photos = append(photos, map[string]interface{}{ + "is_master": 0, + "url": storeSku.SpecialPictures, + }) + } params = map[string]interface{}{ // "name": utils.LimitMixedStringLen(storeSku.SkuName, ebaiapi.MaxSkuNameByteCount), diff --git a/business/partner/purchase/elm/order.go b/business/partner/purchase/elm/order.go index f7853a1d6..0ada62b28 100644 --- a/business/partner/purchase/elm/order.go +++ b/business/partner/purchase/elm/order.go @@ -354,3 +354,8 @@ func (c *PurchaseHandler) GetOrderSettleAccounts(order *model.GoodsOrder) (int64 func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (string, error) { return "", nil } + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + return nil, nil, nil +} diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 6947bd595..9417d47f9 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -706,3 +706,8 @@ func (c *PurchaseHandler) GetPlatformLogisticsFee(order *model.GoodsOrder) (int6 func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (string, error) { return "", nil } + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + return nil, nil, nil +} diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go index 45dd9e546..46d4e71a9 100644 --- a/business/partner/purchase/jd/sku2.go +++ b/business/partner/purchase/jd/sku2.go @@ -179,9 +179,9 @@ func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jd param.ShopCategories = append(param.ShopCategories, utils.Str2Int64(sku.VendorCatID)) } if sku.ImgMix != "" { - param.Images = jxutils.BatchString2Slice(sku.ImgMix, sku.Img2, sku.Img3, sku.Img4, sku.Img5) + param.Images = jxutils.BatchString2Slice(sku.ImgMix, sku.Img2, sku.Img3, sku.Img4, sku.Img5, sku.SpecialPictures) } else { - param.Images = jxutils.BatchString2Slice(sku.Img, sku.Img2, sku.Img3, sku.Img4, sku.Img5) + param.Images = jxutils.BatchString2Slice(sku.Img, sku.Img2, sku.Img3, sku.Img4, sku.Img5, sku.SpecialPictures) } if sku.SkuVendorMapCatID != "" && sku.SkuVendorMapCatID != "0" { diff --git a/business/partner/purchase/jdshop/order.go b/business/partner/purchase/jdshop/order.go index 80882b6ba..76518bdfb 100644 --- a/business/partner/purchase/jdshop/order.go +++ b/business/partner/purchase/jdshop/order.go @@ -343,3 +343,8 @@ func (c *PurchaseHandler) GetPlatformLogisticsFee(order *model.GoodsOrder) (int6 func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (string, error) { return "", nil } + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + return nil, nil, nil +} diff --git a/business/partner/purchase/jx/order.go b/business/partner/purchase/jx/order.go index bc5d58a24..78f38682b 100644 --- a/business/partner/purchase/jx/order.go +++ b/business/partner/purchase/jx/order.go @@ -169,5 +169,10 @@ func (c *PurchaseHandler) GetPlatformLogisticsFee(order *model.GoodsOrder) (int6 // ApplyCompensationOrder 订单索赔 func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (string, error) { - return "",nil + return "", nil +} + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + return nil, nil, nil } diff --git a/business/partner/purchase/mtwm/callback.go b/business/partner/purchase/mtwm/callback.go index 62457c0a7..a4b562806 100644 --- a/business/partner/purchase/mtwm/callback.go +++ b/business/partner/purchase/mtwm/callback.go @@ -147,6 +147,7 @@ func InvoiceCallback(invoice *mtwmapi.InvoiceCallback) (err error) { OrderId: invoice.OrderId, StoreID: localOrder.JxStoreID, VendorID: model.VendorIDMTWM, + Status: model.InvoiceStatusInit, InvoiceTaskId: invoice.InvoiceTaskId, PushType: invoice.PushType, InvoiceTitle: invoice.InvoiceTitle, diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 6ee6b36ce..1c148a561 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -1058,11 +1058,11 @@ func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (strin }) } -func UploadInvoice(param *model.InvoiceMsg) error { +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { goodsOrder, err := partner.CurOrderManager.LoadOrder(param.OrderId, param.VendorID) if err != nil { - return err + return nil, nil, err } - return getAPI(goodsOrder.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(goodsOrder), goodsOrder.VendorStoreID).UploadInvoice(param.OrderId, param.InvoiceUrl, param.InvoiceId, param.InvoiceTaskId) + return nil, nil, getAPI(goodsOrder.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(goodsOrder), goodsOrder.VendorStoreID).UploadInvoice(param.OrderId, param.InvoiceUrl, param.InvoiceId, param.InvoiceTaskId) } diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index f9e863852..558d317f1 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -253,6 +253,14 @@ func GetCategoryAttrList(appOrgCode string, tagID int) (categoryAttrListResult [ return nil, err } +// GetMTProductRule 获取美团商品上传规则 +func GetMTProductRule(tagID int) (categoryAttrListResult *mtwmapi.ProductRulesObj, err error) { + if resp, err := getAPI(beego.AppConfig.DefaultString("mtwmAppID2", ""), 0, "").RetailProductRules(int64(tagID)); err == nil { + return resp, nil + } + return nil, err +} + //GetCategoryAttrValueList 查询特殊属性的属性值列表 func GetCategoryAttrValueList(appOrgCode, keyword string, attrID int) (categoryAttrValueListResult []*mtwmapi.CategoryAttrValueListResult, err error) { if attrID != utils.Str2Int(mtwmapi.SpecialAttrBrand) && attrID != utils.Str2Int(mtwmapi.SpecialAttrProducer) || len(keyword) == 0 || len(appOrgCode) == 0 { @@ -406,6 +414,9 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI foodData["qua_effective_date"] = storeSku.QuaEffectiveDate foodData["qua_approval_date"] = storeSku.QuaApprovalDate } + if storeSku.SpecialPictures != "" { + foodData["special_pictures"] = storeSku.SpecialPictures + } // 周期性可售时间段 if storeSku.StatusSaleBegin != model.NO && storeSku.StatusSaleEnd != model.NO { diff --git a/business/partner/purchase/tao_vegetable/order.go b/business/partner/purchase/tao_vegetable/order.go index 949dda2cb..721822c2c 100644 --- a/business/partner/purchase/tao_vegetable/order.go +++ b/business/partner/purchase/tao_vegetable/order.go @@ -998,3 +998,8 @@ func (c *PurchaseHandler) GetPlatformLogisticsFee(order *model.GoodsOrder) (int6 func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (string, error) { return "", nil } + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + return nil, nil, nil +} diff --git a/business/partner/purchase/tao_vegetable/store_sku2.go b/business/partner/purchase/tao_vegetable/store_sku2.go index 85cac0358..f461a36e7 100644 --- a/business/partner/purchase/tao_vegetable/store_sku2.go +++ b/business/partner/purchase/tao_vegetable/store_sku2.go @@ -255,7 +255,7 @@ func UpdateTaoVegetable(api *tao_vegetable.API, storeSkuList []*dao.StoreSkuSync updateSku.PurchaseQuantity = utils.Int64ToPointer(int64(v.MinOrderCount)) // 起购单位 } // 修改暂时不修改图片,保持效率 - updateSku.SkuPicUrls = uploadImg(api, v.SkuID, model.VendorIDTaoVegetable, []string{v.Img, v.Img2, v.Img3, v.Img4, v.Img5, v.DescImg}) + updateSku.SkuPicUrls = uploadImg(api, v.SkuID, model.VendorIDTaoVegetable, []string{v.Img, v.Img2, v.Img3, v.Img4, v.Img5, v.DescImg, v.SpecialPictures}) if updateSku.SkuPicUrls == nil { continue } @@ -329,7 +329,7 @@ func createTaoVegetable(ctx *jxcontext.Context, api *tao_vegetable.API, storeSku if storeSku.VendorCatID == "175" { sku.MerchantCatCode = utils.String2Pointer("1751") } - sku.SkuPicUrls = uploadImg(api, storeSku.SkuID, model.VendorIDTaoVegetable, []string{storeSku.Img, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5, storeSku.DescImg}) + sku.SkuPicUrls = uploadImg(api, storeSku.SkuID, model.VendorIDTaoVegetable, []string{storeSku.Img, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5, storeSku.DescImg, storeSku.SpecialPictures}) if sku.SkuPicUrls == nil { continue } diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index 325a293bf..0bb34cddb 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -1116,3 +1116,8 @@ func (c *PurchaseHandler) GetPlatformLogisticsFee(order *model.GoodsOrder) (int6 func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (string, error) { return "", nil } + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + return nil, nil, nil +} diff --git a/business/partner/purchase/yb/order.go b/business/partner/purchase/yb/order.go index f0fc554f4..2b144649f 100644 --- a/business/partner/purchase/yb/order.go +++ b/business/partner/purchase/yb/order.go @@ -122,3 +122,8 @@ func (c *PurchaseHandler) GetPlatformLogisticsFee(order *model.GoodsOrder) (int6 func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (string, error) { return "", nil } + +// UploadInvoice 回复用户发票申请 +func (c *PurchaseHandler) UploadInvoice(param *model.InvoiceMsg) ([]string, []string, error) { + return nil, nil, nil +} diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index c307b839c..f61e6e635 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -810,6 +810,21 @@ func (c *SkuController) GetTiktokCategoryValue() { }) } +// @Title 根据美团分类id获取平台扩展规则 +// @Description 根据美团分类id获取平台扩展规则 +// @Param token header string true "认证token" +// @Param mtCategoryId query int64 true "美团类目id" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetMTProductRule [get] +func (c *SkuController) GetMTProductRule() { + c.callGetMTProductRule(func(params *tSkuGetMTProductRuleParams) (retVal interface{}, errCode string, err error) { + data, err := mtwm.GetMTProductRule(params.MtCategoryId) + return data, "", err + }) + +} + // @Title 根据美团分类id获取平台属性值 // @Description 根据美团分类id获取平台属性值 // @Param token header string true "认证token" diff --git a/controllers/jx_order.go b/controllers/jx_order.go index d5e2984b6..8ed71b429 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -4,12 +4,13 @@ import ( "encoding/json" "errors" "fmt" + "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/bidding" "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxstore/permission" "git.rosy.net.cn/jx-callback/business/partner/delivery" - "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" + "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "strings" "time" @@ -1512,7 +1513,7 @@ func (c *OrderController) UpdateTiktokSettlement() { // @router /GetInvoiceRecord [post] func (c *OrderController) GetInvoiceRecord() { c.callGetInvoiceRecord(func(params *tOrderGetInvoiceRecordParams) (retVal interface{}, errCode string, err error) { - retVal, err = dao.GetStoreInvoiceList(params.StoreId, utils.Str2Time(params.StartTime), utils.Str2Time(params.EndTime), params.Status, params.Offset, params.PageSize) + retVal, err = dao.GetStoreInvoiceList(params.StoreId, 0, utils.Str2Time(params.StartTime), utils.Str2Time(params.EndTime), params.Status, params.Offset, params.PageSize) return retVal, errCode, err }) } @@ -1537,9 +1538,78 @@ func (c *OrderController) UploadOrderInvoice() { } invoice.InvoiceUrl = params.InvoiceUrl invoice.InvoiceId = params.InvoiceId - dao.UpdateEntity(db, invoice, "InvoiceUrl", "InvoiceId") + handler, _ := partner.GetPurchasePlatformFromVendorID(invoice.VendorID).(partner.IPurchasePlatformStoreSkuHandler) + success, _, err := handler.UploadInvoice(invoice) + if err != nil { + return nil, "", err + } + switch invoice.VendorID { + case model.VendorIDMTWM: + invoice.Status = model.InvoiceStatusBillingSuccess + case model.VendorIDEBAI: + for _, v := range success { + if v == invoice.InvoiceTaskId { + invoice.Status = model.InvoiceStatusBillingSuccess + } + } - err = mtwm.UploadInvoice(invoice) + } + dao.UpdateEntity(db, invoice, "InvoiceUrl", "InvoiceId", "Status") return retVal, errCode, err }) } + +// @Title 查询门店发票设置 +// @Description 查询门店发票设置 +// @Param token header string true "认证token" +// @Param vendorId formData string true "平台ID" +// @Param vendorStoreID formData string true "平台门店ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /QueryInvoiceSetting [get] +func (c *OrderController) QueryInvoiceSetting() { + c.callQueryInvoiceSetting(func(params *tOrderQueryInvoiceSettingParams) (retVal interface{}, errCode string, err error) { + retVal, err = ebai.QueryInvoiceSetting(params.VendorStoreID) + return + }) +} + +// @Title 批量更新门店发票设置 +// @Description 批量更新门店发票设置 +// @Param token header string true "认证token" +// @Param vendorId formData string true "平台ID" +// @Param vendorStoreID formData string true "平台门店ID" +// @Param payload formData string true "json数据,格式为 ebaiapi.StoreInvoiceSetting" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /BathUpdateInvoiceSetting [post] +func (c *OrderController) BathUpdateInvoiceSetting() { + c.callBathUpdateInvoiceSetting(func(params *tOrderBathUpdateInvoiceSettingParams) (retVal interface{}, errCode string, err error) { + setting := &ebaiapi.StoreInvoiceSetting{} + if err = utils.UnmarshalUseNumber([]byte(params.Payload), setting); err == nil { + success, fail, err := ebai.BathUpdateInvoiceSetting(params.VendorStoreID, setting) + + return map[string]interface{}{ + "success": success, + "fail": fail, + }, "", err + } + return + }) +} + +// @Title 批量更新店铺开票申请 +// @Description 批量更新店铺开票申请 +// @Param token header string true "认证token" +// @Param vendorId formData string true "平台ID" +// @Param vendorStoreID formData string true "平台门店ID" +// @Param storeID formData int true "京西门店ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /QueryUnansweredInvoice [get] +func (c *OrderController) QueryUnansweredInvoice() { + c.callQueryUnansweredInvoice(func(params *tOrderQueryUnansweredInvoiceParams) (retVal interface{}, errCode string, err error) { + retVal, err = ebai.QueryUnansweredInvoice(params.VendorStoreID, params.StoreID) + return + }) +} diff --git a/controllers/mtwm_callback.go b/controllers/mtwm_callback.go index 7f5757ae8..5ac448b0c 100644 --- a/controllers/mtwm_callback.go +++ b/controllers/mtwm_callback.go @@ -150,7 +150,7 @@ func (c *MtwmController) Invoice() { return } globals.SugarLogger.Debugf("------Invoice:= %s", string(body)) - ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "2452A93EEB9111EC9B06525400E86DC0", "淘鲜达token过期", string(body)) + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "2452A93EEB9111EC9B06525400E86DC0", "MtwmController发票推送", string(body)) data := &mtwmapi.InvoiceCallback{} if err = json.Unmarshal(body, data); err != nil { diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index ff6295311..d0777d39c 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1722,6 +1722,35 @@ func init() { MethodParams: param.Make(), Filters: nil, Params: nil}) + // 获取饿了么门店发票设置 + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + web.ControllerComments{ + Method: "QueryInvoiceSetting", + Router: `/QueryInvoiceSetting`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + // 批量更新门店发票设置 + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + web.ControllerComments{ + Method: "BathUpdateInvoiceSetting", + Router: `/BathUpdateInvoiceSetting`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + // 批量更新店铺开票申请 + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + web.ControllerComments{ + Method: "QueryUnansweredInvoice", + Router: `/QueryUnansweredInvoice`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], web.ControllerComments{ @@ -2064,6 +2093,14 @@ func init() { MethodParams: param.Make(), Filters: nil, Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + web.ControllerComments{ + Method: "GetMTProductRule", + Router: `/GetMTProductRule`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], web.ControllerComments{