From 8c6b1bc0671d15df6af20e3e052d074afb899d85 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 9 Apr 2019 11:35:27 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=9C=BA=E6=B5=81=E7=A8=8B=EF=BC=8C=E6=B7=BB=E5=8A=A0=E2=80=9C?= =?UTF-8?q?=E5=A4=96=E5=8D=96=E7=AE=A1=E5=AE=B6=E2=80=9D=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/cms.go | 1 + business/jxstore/cms/store.go | 37 +++-- business/jxstore/tempop/tempop.go | 8 + business/jxutils/netprinter/netprinter.go | 140 +++-------------- business/model/const.go | 29 ++++ business/model/store.go | 5 +- business/partner/partner.go | 52 +++++++ business/partner/printer/feie/feie.go | 176 ++++++++++++++++++++++ business/partner/printer/xiaowm/xiaowm.go | 147 ++++++++++++++++++ conf/app.conf | 3 + controllers/temp_op.go | 17 +++ globals/api/api.go | 5 +- main.go | 3 + routers/commentsRouter_controllers.go | 9 ++ 14 files changed, 500 insertions(+), 132 deletions(-) create mode 100644 business/partner/printer/feie/feie.go create mode 100644 business/partner/printer/xiaowm/xiaowm.go diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 5d02baa9c..1dbac5fdc 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -53,6 +53,7 @@ func InitServiceInfo(version string, buildTime time.Time, gitCommit string) { "opRequestStatusName": model.RequestStatusName, "storeMsgSendStatusName": model.StoreMsgSendStatusName, "shopChineseNames": model.ShopChineseNames, + "printerVendorInfo": model.PrinterVendorInfo, }, } Init() diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index d29821b51..c83a9657c 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -13,6 +13,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/jxutils/netprinter" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" @@ -374,20 +375,30 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa syncStatus |= model.SyncFlagStoreName } // 网络打印机处理 - if valid["printerSN"] != nil || valid["printerKey"] != nil { - originalPrinterSN := store.PrinterSN - if valid["printerSN"] != nil { - store.PrinterSN = valid["printerSN"].(string) - } - if valid["printerKey"] != nil { - store.PrinterKey = valid["printerKey"].(string) - } - if store.PrinterSN != "" { - if err = addNetPrinter(store.PrinterSN, store.PrinterKey, store.Name); err != nil { - return 0, err + if valid["printerVendorID"] != nil { + printerVendorID := valid["printerVendorID"].(int) + if printerVendorID != store.PrinterVendorID { + if handler := partner.GetPrinterPlatformFromVendorID(store.PrinterVendorID); handler != nil { + handler.UnregisterPrinter(ctx, store) } - } else if originalPrinterSN != "" { - api.FeieAPI.PrinterDelList([]string{originalPrinterSN}) + store.PrinterSN = "" + store.PrinterKey = "" + store.PrinterVendorID = printerVendorID + } + } + if valid["printerSN"] != nil || valid["printerKey"] != nil { + if valid["printerKey"] != nil && valid["printerSN"] == nil { + valid["printerSN"] = store.PrinterSN + } + if valid["printerSN"] != nil && valid["printerKey"] == nil { + valid["printerKey"] = store.PrinterKey + } + var handler partner.IPrinterHandler + if handler, err = netprinter.GetHandlerFromStore(store); err != nil { + return 0, err + } + if err = handler.RegisterPrinter(ctx, store, valid["printerSN"].(string), valid["printerKey"].(string)); err != nil { + return 0, err } } diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index 0b79cde89..311b99cc5 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -884,3 +884,11 @@ func RefreshEbaiBadComment(ctx *jxcontext.Context, fromTime, toTime time.Time, i } return hint, err } + +func PrintMsg(ctx *jxcontext.Context, vendorID int, id1, id2, msg string) (printerStatus *partner.PrinterStatus, err error) { + handler := partner.GetPrinterPlatformFromVendorID(vendorID) + if handler == nil { + return nil, fmt.Errorf("打印机厂商:%d当前不被支持,请检查vendorID", vendorID) + } + return handler.PrintMsg(ctx, id1, id2, msg) +} diff --git a/business/jxutils/netprinter/netprinter.go b/business/jxutils/netprinter/netprinter.go index 3b3f0a062..3da093777 100644 --- a/business/jxutils/netprinter/netprinter.go +++ b/business/jxutils/netprinter/netprinter.go @@ -2,108 +2,17 @@ package netprinter import ( "fmt" - "strings" - "time" "git.rosy.net.cn/jx-callback/business/partner" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" - "git.rosy.net.cn/jx-callback/globals/api" ) -type PrinterStatus struct { - PrintResult int `json:"printResult"` // 0:成功,1:没有配置网络打印机 - - // PrinterStatusUnknown = 0 - // PrinterStatusOffline = 1 - // PrinterStatusOnlineOK = 2 - // PrinterStatusOnlineAbnormal = 3 - PrinterStatus int `json:"printerStatus"` - Printed int `json:"printed"` // 已经打印的单数 - Waiting int `json:"waiting"` // 等待打印的单数,超过1一般不太正常 -} - -const ( - PrintResultSuccess = 0 - PrintResultNoNetPrinter = 1 -) - -func GetFeieOrderContent(order *model.GoodsOrder, storeTel string) (content string) { - expectedDeliveryTime := order.ExpectedDeliveredTime - if utils.IsTimeZero(expectedDeliveryTime) { - expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour) - } - orderFmt := ` -京西菜市
-手机买菜上京西
-极速到家送惊喜
---------------------------------
-下单时间: %s
-预计送达: %s
-订单编号: %s
-
- -%s#%d

-%s -
-客户: %s
-电话: %s
-地址: %s
-
-客户备注:
-%s
-
- -实际支付:%s
-
-商品明细:
-品名 数量 单价 小计
---------------------------------
` - orderParams := []interface{}{ - utils.Time2Str(order.OrderCreatedAt), - utils.Time2Str(expectedDeliveryTime), - order.VendorOrderID, - jxutils.GetVendorName(order.VendorID), - order.OrderSeq, - order.VendorOrderID, - order.ConsigneeName, - order.ConsigneeMobile, - order.ConsigneeAddress, - order.BuyerComment, - jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice), - } - - for _, sku := range order.Skus { - orderFmt += `%s
` - orderFmt += `%10s%10s%10s
` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) - } - orderFmt += `
-共%d种%d件商品 -
---------------------------------
-商品质量问题请联系:
-%s:%s

-
-官方服务热线: 18011516898
-更多信息请关注官方微信: 京西菜市
-
-

---------------------------------
---------------------------------
-

-` - // http://weixin.qq.com/r/tkkDGzTERmk5rXB49xyk - orderParams = append(orderParams, order.SkuCount, order.GoodsCount, order.StoreName, storeTel) - return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...) -} - -func PrintOrder(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (printResult *PrinterStatus, err error) { +func PrintOrder(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (printResult *partner.PrinterStatus, err error) { order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) if err == nil { printResult, err = PrintOrderByOrder(ctx, order) @@ -111,22 +20,19 @@ func PrintOrder(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (pri return printResult, err } -func PrintOrderByOrder(ctx *jxcontext.Context, order *model.GoodsOrder) (printResult *PrinterStatus, err error) { +func PrintOrderByOrder(ctx *jxcontext.Context, order *model.GoodsOrder) (printResult *partner.PrinterStatus, err error) { globals.SugarLogger.Debugf("PrintOrderByOrder orderID:%s", order.VendorOrderID) store := &model.Store{} store.ID = jxutils.GetSaleStoreIDFromOrder(order) db := dao.GetDB() if err = dao.GetEntity(db, store); err == nil { - if store.PrinterSN != "" { - content := GetFeieOrderContent(order, store.Tel1) - if _, err = api.FeieAPI.PrintMsg(store.PrinterSN, content, 1); err == nil { - printResult, err = getNetPrinterStatus(ctx, store.PrinterSN) - dao.SetOrderPrintFlag(db, order.VendorOrderID, order.VendorID, true) - } + handler, err := GetHandlerFromStore(store) + if err != nil { + return &partner.PrinterStatus{ + PrintResult: partner.PrintResultNoPrinter, + }, nil } else { - printResult = &PrinterStatus{ - PrintResult: PrintResultNoNetPrinter, - } + return handler.PrintOrder(ctx, store, order) } } if err != nil { @@ -135,27 +41,29 @@ func PrintOrderByOrder(ctx *jxcontext.Context, order *model.GoodsOrder) (printRe return printResult, err } -func GetNetPrinterStatus(ctx *jxcontext.Context, storeID int) (printResult *PrinterStatus, err error) { +func GetNetPrinterStatus(ctx *jxcontext.Context, storeID int) (printResult *partner.PrinterStatus, err error) { store := &model.Store{} store.ID = storeID db := dao.GetDB() if err = dao.GetEntity(db, store); err == nil { - if store.PrinterSN != "" { - return getNetPrinterStatus(ctx, store.PrinterSN) - } - return &PrinterStatus{ - PrintResult: PrintResultNoNetPrinter, - }, nil + return getNetPrinterStatus(ctx, store) } return nil, err } -func getNetPrinterStatus(ctx *jxcontext.Context, sn string) (printResult *PrinterStatus, err error) { - printResult = &PrinterStatus{ - PrintResult: PrintResultSuccess, +func getNetPrinterStatus(ctx *jxcontext.Context, store *model.Store) (printResult *partner.PrinterStatus, err error) { + handler, err := GetHandlerFromStore(store) + if err != nil { + return &partner.PrinterStatus{ + PrintResult: partner.PrintResultNoPrinter, + }, nil } - if printResult.PrinterStatus, err = api.FeieAPI.QueryPrinterStatus(sn); err == nil { - printResult.Printed, printResult.Waiting, err = api.FeieAPI.QueryOrderInfoByDate(sn, time.Now()) - } - return printResult, nil + return handler.GetPrinterStatus(ctx, store.PrinterSN, store.PrinterKey) +} + +func GetHandlerFromStore(store *model.Store) (printerHandler partner.IPrinterHandler, err error) { + if printerHandler = partner.GetPrinterPlatformFromVendorID(store.PrinterVendorID); printerHandler == nil { + return nil, fmt.Errorf("门店%s不支持网络打印机", store.Name) + } + return printerHandler, nil } diff --git a/business/model/const.go b/business/model/const.go index dada18686..f988ea296 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -17,6 +17,11 @@ const ( VendorIDMTPS = 102 VendorIDFengNiao = 103 VendorIDDeliveryEnd = VendorIDFengNiao + + VendorIDPrinterBegin = 201 + VendorIDFeiE = 201 // 飞鹅打印机 + VendorIDXiaoWM = 202 // 外卖管家打印机 + VendorIDPrinterEnd = 202 ) var ( @@ -29,6 +34,9 @@ var ( VendorIDDada: "Dada", VendorIDMTPS: "Mtps", + + VendorIDFeiE: "Feie", + VendorIDXiaoWM: "XiaoWM", } VendorChineseNames = map[int]string{ VendorIDJD: "京东到家", @@ -39,6 +47,9 @@ var ( VendorIDDada: "达达众包", VendorIDMTPS: "美团配送", + + VendorIDFeiE: "飞鹅", + VendorIDXiaoWM: "外卖管家", } ShopChineseNames = map[int]string{ @@ -94,6 +105,19 @@ var ( VendorIDELM: 0, VendorIDEBAI: 0, } + + PrinterVendorInfo = map[int][]string{ + VendorIDFeiE: []string{ + VendorChineseNames[VendorIDFeiE], + "序列号", + "KEY", + }, + VendorIDXiaoWM: []string{ + VendorChineseNames[VendorIDXiaoWM], + "打印机编号", + "不填", + }, + } ) const ( @@ -198,3 +222,8 @@ func IsDeliveryVendorExist(vendorID int) bool { _, ok := VendorNames[vendorID] return ok && vendorID >= VendorIDDeliveryBegin && vendorID <= VendorIDDeliveryEnd } + +func IsPrinterVendorExist(vendorID int) bool { + _, ok := VendorNames[vendorID] + return ok && vendorID >= VendorIDPrinterBegin && vendorID <= VendorIDPrinterEnd +} diff --git a/business/model/store.go b/business/model/store.go index 90336d3a7..875dba0c2 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -131,8 +131,9 @@ type Store struct { Status int `json:"status"` ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 - PrinterSN string `orm:"size(32);column(printer_sn);index" json:"printerSN"` - PrinterKey string `orm:"size(32)" json:"printerKey"` + PrinterVendorID int `column(printer_vendor_id);json:"printerVendorID"` + PrinterSN string `orm:"size(32);column(printer_sn);index" json:"printerSN"` + PrinterKey string `orm:"size(32)" json:"printerKey"` IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"` IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"` diff --git a/business/partner/partner.go b/business/partner/partner.go index 60b67b2d6..08e078d06 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -22,6 +22,30 @@ const ( CancelWaybillReasonOther = 10 ) +const ( + PrinterStatusUnknown = 0 + PrinterStatusOffline = 1 + PrinterStatusOnlineOK = 2 + PrinterStatusOnlineAbnormal = 3 +) + +const ( + PrintResultSuccess = 0 + PrintResultNoPrinter = 1 +) + +type PrinterStatus struct { + PrintResult int `json:"printResult"` // 0:成功,1:没有配置网络打印机 + + // PrinterStatusUnknown = 0 + // PrinterStatusOffline = 1 + // PrinterStatusOnlineOK = 2 + // PrinterStatusOnlineAbnormal = 3 + PrinterStatus int `json:"printerStatus"` + Printed int `json:"printed"` // 已经打印的单数 + Waiting int `json:"waiting"` // 等待打印的单数,超过1一般不太正常 +} + const ( TimerTypeNoOverride = 0 // GetStatusActionConfig 返回表示不修改缺省配置 TimerTypeByPass = 1 @@ -65,6 +89,7 @@ var ( PurchasePlatformHandlers map[int]IPurchasePlatformHandler DeliveryPlatformHandlers map[int]*DeliveryPlatformHandlerInfo UseableDeliveryVendorIDs []int + PrinterPlatformHandlers map[int]IPrinterHandler ) type IOrderManager interface { @@ -167,6 +192,16 @@ type IDeliveryPlatformHandler interface { GetVendorID() int } +type IPrinterHandler interface { + GetVendorID() int + PrintMsg(ctx *jxcontext.Context, id1, id2, msg string) (printerStatus *PrinterStatus, err error) + GetPrinterStatus(ctx *jxcontext.Context, id1, id2 string) (printerStatus *PrinterStatus, err error) + + PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *PrinterStatus, err error) + RegisterPrinter(ctx *jxcontext.Context, store *model.Store, id1, id2 string) (err error) + UnregisterPrinter(ctx *jxcontext.Context, store *model.Store) (err error) +} + type DeliveryPlatformHandlerInfo struct { Handler IDeliveryPlatformHandler Use4CreateWaybill bool @@ -182,6 +217,7 @@ func (p *BasePurchasePlatform) GetStatusActionTimeout(order *model.GoodsOrder, s func init() { PurchasePlatformHandlers = make(map[int]IPurchasePlatformHandler) DeliveryPlatformHandlers = make(map[int]*DeliveryPlatformHandlerInfo) + PrinterPlatformHandlers = make(map[int]IPrinterHandler) } func Init(curOrderManager IOrderManager) { @@ -213,6 +249,18 @@ func RegisterDeliveryPlatform(handler IDeliveryPlatformHandler, isUse4CreateWayb } UseableDeliveryVendorIDs = append(UseableDeliveryVendorIDs, vendorID) } + +func RegisterPrinterPlatform(handler IPrinterHandler) { + vendorID := handler.GetVendorID() + if !(model.IsPrinterVendorExist(vendorID)) { + panic(fmt.Sprintf("printer vendor:%d is illegal", vendorID)) + } + if _, ok := PrinterPlatformHandlers[vendorID]; ok { + panic(fmt.Sprintf("printer vendor:%d, already exists", vendorID)) + } + PrinterPlatformHandlers[vendorID] = handler +} + func GetPurchasePlatformFromVendorID(vendorID int) IPurchasePlatformHandler { return PurchasePlatformHandlers[vendorID] } @@ -220,3 +268,7 @@ func GetPurchasePlatformFromVendorID(vendorID int) IPurchasePlatformHandler { func GetDeliveryPlatformFromVendorID(vendorID int) *DeliveryPlatformHandlerInfo { return DeliveryPlatformHandlers[vendorID] } + +func GetPrinterPlatformFromVendorID(vendorID int) IPrinterHandler { + return PrinterPlatformHandlers[vendorID] +} diff --git a/business/partner/printer/feie/feie.go b/business/partner/printer/feie/feie.go new file mode 100644 index 000000000..b938ed298 --- /dev/null +++ b/business/partner/printer/feie/feie.go @@ -0,0 +1,176 @@ +package feie + +import ( + "fmt" + "strings" + "time" + + "git.rosy.net.cn/baseapi/platformapi/feieapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +var ( + CurPrinterHandler *PrinterHandler +) + +type PrinterHandler struct { +} + +func init() { + CurPrinterHandler = new(PrinterHandler) + partner.RegisterPrinterPlatform(CurPrinterHandler) +} + +func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string) (content string) { + expectedDeliveryTime := order.ExpectedDeliveredTime + if utils.IsTimeZero(expectedDeliveryTime) { + expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour) + } + orderFmt := ` +京西菜市
+手机买菜上京西
+极速到家送惊喜
+--------------------------------
+下单时间: %s
+预计送达: %s
+订单编号: %s
+
+ +%s#%d

+%s +
+客户: %s
+电话: %s
+地址: %s
+
+客户备注:
+%s
+
+ +实际支付:%s
+
+商品明细:
+品名 数量 单价 小计
+--------------------------------
` + orderParams := []interface{}{ + utils.Time2Str(order.OrderCreatedAt), + utils.Time2Str(expectedDeliveryTime), + order.VendorOrderID, + jxutils.GetVendorName(order.VendorID), + order.OrderSeq, + order.VendorOrderID, + order.ConsigneeName, + order.ConsigneeMobile, + order.ConsigneeAddress, + order.BuyerComment, + jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice), + } + + for _, sku := range order.Skus { + orderFmt += `%s
` + orderFmt += `%10s%10s%10s
` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + } + orderFmt += `
+共%d种%d件商品 +
+--------------------------------
+商品质量问题请联系:
+%s:%s

+
+官方服务热线: 18011516898
+更多信息请关注官方微信: 京西菜市
+
+

+--------------------------------
+--------------------------------
+

+` + // http://weixin.qq.com/r/tkkDGzTERmk5rXB49xyk + orderParams = append(orderParams, order.SkuCount, order.GoodsCount, order.StoreName, storeTel) + return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...) +} + +func (c *PrinterHandler) GetVendorID() int { + return model.VendorIDFeiE +} + +func (c *PrinterHandler) PrintMsg(ctx *jxcontext.Context, id1, id2, msg string) (printerStatus *partner.PrinterStatus, err error) { + globals.SugarLogger.Debugf("PrintMsg id1:%s", id1) + if id1 != "" { + if _, err = api.FeieAPI.PrintMsg(id1, msg, 1); err == nil { + printerStatus, err = c.GetPrinterStatus(ctx, id1, id2) + } + } else { + printerStatus = &partner.PrinterStatus{ + PrintResult: partner.PrintResultNoPrinter, + } + } + return printerStatus, err +} + +func (c *PrinterHandler) GetPrinterStatus(ctx *jxcontext.Context, id1, id2 string) (printerStatus *partner.PrinterStatus, err error) { + sn := id1 + printerStatus = &partner.PrinterStatus{ + PrintResult: partner.PrintResultSuccess, + } + if printerStatus.PrinterStatus, err = api.FeieAPI.QueryPrinterStatus(sn); err == nil { + printerStatus.Printed, printerStatus.Waiting, err = api.FeieAPI.QueryOrderInfoByDate(sn, time.Now()) + } + return printerStatus, nil +} + +func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) { + globals.SugarLogger.Debugf("feie PrintOrderByOrder orderID:%s", order.VendorOrderID) + content := c.getOrderContent(order, store.Tel1) + return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, content) +} + +func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, store *model.Store, id1, id2 string) (err error) { + if store.PrinterSN != "" && (store.PrinterSN != id1 || store.PrinterKey != id2) { + err = c.UnregisterPrinter(ctx, store) + } + if true { //err == nil { + if id1 != "" { + if err = addNetPrinter(id1, id2, store.Name); err == nil { + store.PrinterSN = id1 + store.PrinterKey = id2 + } + } + } + return err +} + +func (c *PrinterHandler) UnregisterPrinter(ctx *jxcontext.Context, store *model.Store) (err error) { + if store.PrinterSN != "" { + _, _, err = api.FeieAPI.PrinterDelList([]string{store.PrinterSN}) + } + return err +} + +func addNetPrinter(sn, key, storeName string) (err error) { + name := storeName + _, no, err := api.FeieAPI.PrinterAddList([]*feieapi.PrinterInfo{ + &feieapi.PrinterInfo{ + SN: sn, + Key: key, + Name: name, + }, + }) + if err == nil { + if no[sn] != "" { + if no[sn] == feieapi.ErrMsgAlredyAdded { + api.FeieAPI.PrinterEdit(sn, name, "") + } else { + err = fmt.Errorf("添加打印机出错:%s", no[sn]) + } + } + } + return err +} diff --git a/business/partner/printer/xiaowm/xiaowm.go b/business/partner/printer/xiaowm/xiaowm.go new file mode 100644 index 000000000..bb2573ad1 --- /dev/null +++ b/business/partner/printer/xiaowm/xiaowm.go @@ -0,0 +1,147 @@ +package xiaowm + +import ( + "fmt" + "strings" + "time" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +var ( + CurPrinterHandler *PrinterHandler +) + +type PrinterHandler struct { +} + +func init() { + CurPrinterHandler = new(PrinterHandler) + partner.RegisterPrinterPlatform(CurPrinterHandler) +} + +func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string) (content string) { + expectedDeliveryTime := order.ExpectedDeliveredTime + if utils.IsTimeZero(expectedDeliveryTime) { + expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour) + } + orderFmt := ` +京西菜市
+手机买菜上京西
+极速到家送惊喜
+--------------------------------
+下单时间: %s
+预计送达: %s
+订单编号: %s
+
+ +%s#%d

+%s +
+客户: %s
+电话: %s
+地址: %s
+
+客户备注:
+%s
+
+ +实际支付:%s
+
+商品明细:
+品名 数量 单价 小计
+--------------------------------
` + orderParams := []interface{}{ + utils.Time2Str(order.OrderCreatedAt), + utils.Time2Str(expectedDeliveryTime), + order.VendorOrderID, + jxutils.GetVendorName(order.VendorID), + order.OrderSeq, + order.VendorOrderID, + order.ConsigneeName, + order.ConsigneeMobile, + order.ConsigneeAddress, + order.BuyerComment, + jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice), + } + + for _, sku := range order.Skus { + orderFmt += `%s
` + orderFmt += `%10s%10s%10s
` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + } + orderFmt += `
+共%d种%d件商品 +
+--------------------------------
+商品质量问题请联系:
+%s:%s

+
+官方服务热线: 18011516898
+更多信息请关注官方微信: 京西菜市
+
+

+--------------------------------
+--------------------------------
+

+` + // http://weixin.qq.com/r/tkkDGzTERmk5rXB49xyk + orderParams = append(orderParams, order.SkuCount, order.GoodsCount, order.StoreName, storeTel) + return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...) +} + +func (c *PrinterHandler) GetVendorID() int { + return model.VendorIDXiaoWM +} + +func (c *PrinterHandler) PrintMsg(ctx *jxcontext.Context, id1, id2, msg string) (printerStatus *partner.PrinterStatus, err error) { + globals.SugarLogger.Debugf("PrintMsg id1:%s", id1) + if id1 != "" { + if _, err = api.XiaoWMAPI.SendMsg(id1, id2, msg); err == nil { + printerStatus, err = c.GetPrinterStatus(ctx, id1, id2) + } + } else { + printerStatus = &partner.PrinterStatus{ + PrintResult: partner.PrintResultNoPrinter, + } + } + return printerStatus, err +} + +func (c *PrinterHandler) GetPrinterStatus(ctx *jxcontext.Context, id1, id2 string) (printerStatus *partner.PrinterStatus, err error) { + return printerStatus, err +} + +func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) { + globals.SugarLogger.Debugf("xiaowm PrintOrderByOrder orderID:%s", order.VendorOrderID) + content := c.getOrderContent(order, store.Tel1) + return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, content) +} + +func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, store *model.Store, id1, id2 string) (err error) { + if store.PrinterSN != "" && (store.PrinterSN != id1 || store.PrinterKey != id2) { + err = c.UnregisterPrinter(ctx, store) + } + if true { //err == nil { + if id1 != "" { + // if err = addNetPrinter(id1, id2, store.Name); err == nil { + // store.PrinterSN = id1 + // store.PrinterKey = id2 + // } + } + } + return err +} + +func (c *PrinterHandler) UnregisterPrinter(ctx *jxcontext.Context, store *model.Store) (err error) { + if store.PrinterSN != "" { + // _, _, err = api.FeieAPI.PrinterDelList([]string{store.PrinterSN}) + } + return err +} diff --git a/conf/app.conf b/conf/app.conf index db063cefc..c824f2ed4 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -69,6 +69,9 @@ dingdingCorpID = "ding7ab5687f3784a8db" feieUser = "jianhua.xu@rosy.net.cn" feieKey = "2JfKh8TyheQ9mwss" +xiaoWMAppID = 267 +xiaoWMAppKey = "94337" + [dev] jdToken = "c8854ef2-f80a-45ee-aceb-dc8014d646f8" jdAppKey = "06692746f7224695ad4788ce340bc854" diff --git a/controllers/temp_op.go b/controllers/temp_op.go index b0d586255..9c39dda4f 100644 --- a/controllers/temp_op.go +++ b/controllers/temp_op.go @@ -162,3 +162,20 @@ func (c *InitDataController) RefreshEbaiBadComment() { return retVal, "", err }) } + +// @Title 测试打印 +// @Description 测试打印 +// @Param token header string true "认证token" +// @Param vendorID formData int true "打印机厂商ID" +// @Param id1 formData string true "id1" +// @Param id2 formData string true "id2" +// @Param msg formData string true "打印消息" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /PrintMsg [post] +func (c *InitDataController) PrintMsg() { + c.callPrintMsg(func(params *tInitdataPrintMsgParams) (retVal interface{}, errCode string, err error) { + retVal, err = tempop.PrintMsg(params.Ctx, params.VendorID, params.Id1, params.Id2, params.Msg) + return retVal, "", err + }) +} diff --git a/globals/api/api.go b/globals/api/api.go index e0653d77a..2e29651d2 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -16,6 +16,7 @@ import ( "git.rosy.net.cn/baseapi/platformapi/showapi" "git.rosy.net.cn/baseapi/platformapi/weimobapi" "git.rosy.net.cn/baseapi/platformapi/weixinapi" + "git.rosy.net.cn/baseapi/platformapi/xiaowmapi" "git.rosy.net.cn/jx-callback/business/jxutils/cache" "git.rosy.net.cn/jx-callback/business/jxutils/cache/redis" @@ -41,7 +42,8 @@ var ( DingDingAPI *dingdingapi.API DingDingQRCodeAPI *dingdingapi.API - FeieAPI *feieapi.API + FeieAPI *feieapi.API + XiaoWMAPI *xiaowmapi.API Cacher cache.ICacher ) @@ -97,6 +99,7 @@ func Init() { DingDingQRCodeAPI = dingdingapi.New(beego.AppConfig.DefaultString("dingdingCorpID", ""), beego.AppConfig.DefaultString("dingdingQRCodeAppKey", ""), beego.AppConfig.DefaultString("dingdingQRCodeSecret", "")) FeieAPI = feieapi.New(beego.AppConfig.DefaultString("feieUser", ""), beego.AppConfig.DefaultString("feieKey", "")) + XiaoWMAPI = xiaowmapi.New(beego.AppConfig.DefaultInt("xiaoWMAppID", 0), beego.AppConfig.DefaultString("xiaoWMAppKey", "")) } func initElm() { diff --git a/main.go b/main.go index 13764fd4f..5afe28c6c 100644 --- a/main.go +++ b/main.go @@ -19,6 +19,9 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/beegodb" _ "git.rosy.net.cn/jx-callback/routers" + + _ "git.rosy.net.cn/jx-callback/business/partner/printer/feie" + _ "git.rosy.net.cn/jx-callback/business/partner/printer/xiaowm" "github.com/astaxie/beego" ) diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 94e66eb90..df415c1eb 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -394,6 +394,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], + beego.ControllerComments{ + Method: "PrintMsg", + Router: `/PrintMsg`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], beego.ControllerComments{ Method: "PullJdOrder",