diff --git a/business/jxutils/weixinmsg/weixinmsg.go b/business/jxutils/weixinmsg/weixinmsg.go index 17dea9940..e845323d9 100644 --- a/business/jxutils/weixinmsg/weixinmsg.go +++ b/business/jxutils/weixinmsg/weixinmsg.go @@ -132,26 +132,22 @@ func GetWeixinOpenIDsFromStoreID(storeID int) (retVal []string) { } func SendMsgToStore(storeID int, templateID, downloadURL, miniPageURL string, data interface{}) (err error) { - if storeID == 0 { // 测试,只发给我 - // SmartMessageTemplateSend("oYN_ust9hXKEvEv0X6Mq6nlAWs_E", templateID, downloadURL, miniPageURL, data) - } else { - openIDs := GetWeixinOpenIDsFromStoreID(storeID) - successCount := 0 - for _, openID := range openIDs { - realMiniPageURL := miniPageURL - if err2 := SmartMessageTemplateSend(openID, templateID, downloadURL, realMiniPageURL, data); err2 == nil { - successCount++ - } else { - err = err2 - } - } - if successCount > 0 { - err = nil // 只要成功一个都当成成功 - } - if err != nil { - globals.SugarLogger.Debugf("SendMsgToStore all failed storeID:%d, templateID:%s, error:%v", storeID, templateID, err) + openIDs := GetWeixinOpenIDsFromStoreID(storeID) + successCount := 0 + for _, openID := range openIDs { + realMiniPageURL := miniPageURL + if err2 := SmartMessageTemplateSend(openID, templateID, downloadURL, realMiniPageURL, data); err2 == nil { + successCount++ + } else { + err = err2 } } + if successCount > 0 { + err = nil // 只要成功一个都当成成功 + } + if err != nil { + globals.SugarLogger.Debugf("SendMsgToStore all failed storeID:%d, templateID:%s, error:%v", storeID, templateID, err) + } return err } @@ -256,7 +252,6 @@ func NotifyNewOrder(order *model.GoodsOrder) (err error) { }, } storeID := jxutils.GetSaleStoreIDFromOrder(order) - globals.SugarLogger.Debugf("NotifyNewOrder storeID=%d", storeID) return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID2, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data) } diff --git a/business/model/dao/invoice_dao.go b/business/model/dao/invoice_dao.go new file mode 100644 index 000000000..3af00b243 --- /dev/null +++ b/business/model/dao/invoice_dao.go @@ -0,0 +1,55 @@ +package dao + +import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" + "time" +) + +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}...) + return data, err +} + +func GetStoreInvoiceList(storeID 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 { + sql += ` AND store_id = ? ` + parameter = append(parameter, storeID) + } + if !utils.IsTimeZero(startTime) { + sql += ` AND created_at >= ? ` + parameter = append(parameter, startTime) + } + if !utils.IsTimeZero(endTime) { + sql += ` AND created_at <= ? ` + parameter = append(parameter, endTime) + } + if status != "" { + switch status { + case "1": // 未回复 + sql += ` AND invoice_url = ""` + case "2": // 已回复 + sql += ` AND invoice_url <> ""` + } + } + sql += " LIMIT ? OFFSET ?" + parameter = append(parameter, jxutils.FormalizePageSize(pageSize), offset) + db := GetDB() + txDB, _ := Begin(db) + defer Commit(db, txDB) + data := make([]*model.InvoiceMsg, 0, 0) + if err = GetRowsTx(txDB, &data, sql, parameter...); err == nil { + pagedInfo := &model.PagedInfo{ + TotalCount: GetLastTotalRowCount2(db, txDB), + Data: data, + } + return pagedInfo, nil + } + + return nil, err +} diff --git a/business/model/invoice_msg.go b/business/model/invoice_msg.go new file mode 100644 index 000000000..6246c7fc9 --- /dev/null +++ b/business/model/invoice_msg.go @@ -0,0 +1,31 @@ +package model + +type InvoiceMsg struct { + ModelIDCUL + OrderId string `orm:"column(order_id);size(32)" json:"order_id"` // 订单ID + 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 + 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"` // 纳税人识别号 + NeedInvoiceByCategory int `orm:"column(need_category);size(2)" json:"needCategory"` // 是否需要按大类开票:1-需要按大类开票;2-需要商品明细开票;如果用户端没有选择,默认是按照明细开票 + CompanyAddress string `orm:"column(company_address);size(256)" json:"companyAddress"` // 公司地址 + CompanyPhone string `orm:"column(company_phone);size(16)" json:"companyPhone"` // 公司电话 + AccountBank string `orm:"column(account_bank);size(64)" json:"accountBank"` // 开户银行 + AccountNumber string `orm:"column(account_number);size(32)" json:"accountNumber"` // 开户账号 + Email string `orm:"column(email);size(64)" json:"email"` // 邮箱 + 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"` // 发票号码 +} + +func (o *InvoiceMsg) TableUnique() [][]string { + return [][]string{} +} +func (o *InvoiceMsg) TableIndex() [][]string { + return [][]string{ + []string{"CreatedAt", "StoreID"}, + []string{"OrderId"}, + } +} diff --git a/business/partner/printer/feie/feie.go b/business/partner/printer/feie/feie.go index 4a0055882..b7863b2b9 100644 --- a/business/partner/printer/feie/feie.go +++ b/business/partner/printer/feie/feie.go @@ -54,6 +54,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin } orderFmt += ` %s#%d

+%s:%s

--------------------------------
下单时间: %s
预计送达: %s
@@ -92,6 +93,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin orderParams = append(orderParams, jxutils.GetVendorName(order.VendorID), order.OrderSeq, + order.StoreName, storeTel, utils.Time2Str(order.OrderCreatedAt), utils.Time2Str(expectedDeliveryTime), order.VendorOrderID, @@ -130,14 +132,13 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin 实付:%s --------------------------------
商品质量问题请联系:
-%s:%s

更多信息请关注官方微信: %s

--------------------------------
--------------------------------
` // http://weixin.qq.com/r/tkkDGzTERmk5rXB49xyk - orderParams = append(orderParams, order.SkuCount, order.GoodsCount, jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice), order.StoreName, storeTel, globals.StoreName) + orderParams = append(orderParams, order.SkuCount, order.GoodsCount, jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice), globals.StoreName) return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...) } @@ -166,6 +167,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st } orderFmt += ` %s#%d

+%s:%s

--------------------------------
下单时间: %s
预计送达: %s
@@ -200,6 +202,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st orderParams = append(orderParams, jxutils.GetVendorName(order.VendorID), order.OrderSeq, + order.StoreName, storeTel, utils.Time2Str(order.OrderCreatedAt), utils.Time2Str(expectedDeliveryTime), order.VendorOrderID, @@ -236,14 +239,13 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
--------------------------------
商品质量问题请联系:
-%s:%s

更多信息请关注官方微信: %s

--------------------------------
--------------------------------
` // http://weixin.qq.com/r/tkkDGzTERmk5rXB49xyk - orderParams = append(orderParams, order.SkuCount, order.GoodsCount, jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice), order.StoreName, storeTel, globals.StoreName) + orderParams = append(orderParams, order.SkuCount, order.GoodsCount, jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice), globals.StoreName) return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...) } diff --git a/business/partner/purchase/mtwm/callback.go b/business/partner/purchase/mtwm/callback.go index 321ceab7c..caf7356c0 100644 --- a/business/partner/purchase/mtwm/callback.go +++ b/business/partner/purchase/mtwm/callback.go @@ -2,7 +2,10 @@ package mtwm import ( "encoding/json" + "fmt" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner/im" beego "github.com/astaxie/beego/server/web" "net/http" @@ -130,3 +133,42 @@ func pushIMToGyOrPet(msg *mtwmapi.ImCallbackMsg, serverType string) { return } + +func InvoiceCallback(invoice *mtwmapi.InvoiceCallback) (err error) { + localOrder, _ := partner.CurOrderManager.LoadOrder(invoice.OrderId, model.VendorIDMTWM) + if localOrder == nil { + return fmt.Errorf("订单不存在:%s", invoice.OrderId) + } + invoiceData, _ := dao.GetInvoiceInfo(dao.GetDB(), invoice.OrderId) + if invoiceData == nil { + invoiceObj := model.InvoiceMsg{ + ModelIDCUL: model.ModelIDCUL{}, + OrderId: invoice.OrderId, + StoreID: localOrder.JxStoreID, + VendorID: model.VendorIDMTWM, + InvoiceTaskId: invoice.InvoiceTaskId, + PushType: invoice.PushType, + InvoiceTitle: invoice.InvoiceTitle, + TaxpayerId: invoice.TaxpayerId, + NeedInvoiceByCategory: invoice.NeedInvoiceByCategory, + CompanyAddress: invoice.CompanyAddress, + CompanyPhone: invoice.CompanyPhone, + AccountBank: invoice.AccountBank, + AccountNumber: invoice.AccountNumber, + Email: invoice.Email, + InvoiceAmount: invoice.ItemTotalInvoiceAmount, + InvoiceUrl: "", + InvoiceId: "", + } + dao.WrapAddIDCULEntity(invoiceObj, "system") + if err = dao.CreateEntity(dao.GetDB(), invoiceObj); err != nil { + return err + } + } + + content2 := fmt.Sprintf("订单:%s,用户申请发票,请老板提供发票信息!", localOrder.VendorOrderID) + if _, err = weixinmsg.SendStoreMessage(jxcontext.AdminCtx, "美团用户申请发票", content2, []int{localOrder.JxStoreID}, nil, "", model.MessageTypeStore, true, true); err != nil { + im.PushMsgByCid(localOrder.VendorStoreID, localOrder.VendorID, content2) + } + return err +} diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index c6683bb98..a9eaafd03 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -1058,3 +1058,12 @@ func (c *PurchaseHandler) ApplyCompensationOrder(order *model.GoodsOrder) (strin Amount: num, }) } + +func UploadInvoice(param *model.InvoiceMsg) error { + goodsOrder, err := partner.CurOrderManager.LoadOrder(param.OrderId, param.VendorID) + if err != nil { + return err + } + + return getAPI(goodsOrder.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(goodsOrder), goodsOrder.VendorStoreID).UploadInvoice(param.OrderId, param.InvoiceUrl, param.InvoiceId, param.InvoiceTaskId) +} diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 41fe1967a..d5e2984b6 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -9,6 +9,7 @@ import ( "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" "strings" "time" @@ -1496,3 +1497,49 @@ func (c *OrderController) UpdateTiktokSettlement() { return retVal, errCode, err }) } + +// @Title 获取门店的发票申请 +// @Description 获取门店的发票申请 +// @Param token header string true "认证token" +// @Param storeId formData int false "门店id" +// @Param startTime formData string true "开始时间" +// @Param endTime formData string true "结束时间" +// @Param status formData string false "发票回复状态[1未回复/2回复]" +// @Param offset query int false "结果起始序号(以0开始,缺省为0)" +// @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @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) + return retVal, errCode, err + }) +} + +// @Title 上传订单发票 +// @Description 上传订单发票 +// @Param token header string true "认证token" +// @Param orderId formData string true "订单ID" +// @Param invoiceUrl formData string true "发票地址[10M内pdf/png/jpeg/jpg]" +// @Param invoiceId formData string true "发票号码" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UploadOrderInvoice [post] +func (c *OrderController) UploadOrderInvoice() { + c.callUploadOrderInvoice(func(params *tOrderUploadOrderInvoiceParams) (retVal interface{}, errCode string, err error) { + var ( + db = dao.GetDB() + ) + invoice, err := dao.GetInvoiceInfo(db, params.OrderId) + if err != nil { + return retVal, errCode, err + } + invoice.InvoiceUrl = params.InvoiceUrl + invoice.InvoiceId = params.InvoiceId + dao.UpdateEntity(db, invoice, "InvoiceUrl", "InvoiceId") + + err = mtwm.UploadInvoice(invoice) + return retVal, errCode, err + }) +} diff --git a/controllers/mtwm_callback.go b/controllers/mtwm_callback.go index 69b8b8406..f068396cb 100644 --- a/controllers/mtwm_callback.go +++ b/controllers/mtwm_callback.go @@ -144,13 +144,24 @@ func (c *MtwmController) DeliveryFeeChange() { func (c *MtwmController) Invoice() { body, err := ioutil.ReadAll(c.Ctx.Request.Body) if err != nil { - c.Data["json"] = mtwmapi.Err2CallbackResponse(err, "") + c.Data["json"] = map[string]interface{}{"result_code": -1} c.ServeJSON() return } globals.SugarLogger.Debugf("------body:= %s", string(body)) - callbackResponse := mtwmapi.Err2CallbackResponse(nil, "") - c.Data["json"] = callbackResponse + + data := &mtwmapi.InvoiceCallback{} + if err = json.Unmarshal(body, data); err != nil { + c.Data["json"] = map[string]interface{}{"result_code": -1} + c.ServeJSON() + return + } + + // 消息通知 + if err = mtwm.InvoiceCallback(data); err != nil { + globals.SugarLogger.Errorf("mtwm Invoice err := %v", err) + } + c.Data["json"] = map[string]interface{}{"result_code": 1} c.ServeJSON() } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 9e13a3c58..de1b66209 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1704,6 +1704,24 @@ 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: "GetInvoiceRecord", + Router: `/GetInvoiceRecord`, + 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: "UploadOrderInvoice", + Router: `/UploadOrderInvoice`, + 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{