This commit is contained in:
邹宗楠
2022-08-25 16:10:01 +08:00
parent be87623211
commit 66db5867a4
49 changed files with 2364 additions and 649 deletions

View File

@@ -5,6 +5,7 @@ import (
"git.rosy.net.cn/baseapi/platformapi/tibiotapi"
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
"git.rosy.net.cn/baseapi/platformapi/wxpayapi"
"git.rosy.net.cn/jx-print/globals"
wx "git.rosy.net.cn/jx-print/model/app_model"
aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate"
@@ -19,6 +20,7 @@ var (
TibiotAPI *tibiotapi.API
TLpayAPI *tonglianpayapi.API //通联收银宝api
WeixinMiniAPI *weixinapi.API // 微信小程序
WxpayAPI *wxpayapi.API // 微信支付API
)
@@ -31,5 +33,5 @@ func init() {
SMSClient = aliyunsmsclient.New("http://dysmsapi.aliyuncs.com/")
TLpayAPI = tonglianpayapi.New("00183083", "18048531223", "56065105499TVAH")
WeixinMiniAPI = weixinapi.New(wx.WeChatAPPID, wx.WeChatAPPSecret)
WxpayAPI = wxpayapi.NewWithCertificate(wx.WeChatAPPID, wx.WeChatAPPSecret, "", "conf/apiclient_cert.pem", "conf/apiclient_key.pem")
}

View File

@@ -0,0 +1,13 @@
package app_server
import "git.rosy.net.cn/jx-print/dao"
type PrintActivation struct {
}
var PrintActivationServer = new(PrintActivation)
// QueryPrintHeard 查询打印机是否激活
func (p *PrintActivation) QueryPrintHeard(printNo string) (bool, error) {
return dao.PrintActivationDao.QueryPrintHeartBeat(printNo)
}

View File

@@ -0,0 +1,49 @@
package app_server
import (
"fmt"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/model/app_model"
"github.com/jmoiron/sqlx"
)
type PrintBill struct {
}
var PrintBillServer = new(PrintBill)
// InitPPrintBill 初始化打印机账户
func (p *PrintBill) InitPPrintBill(tx *sqlx.Tx, bill *app_model.PrintBill) error {
// 查询打印机是否有账户,没有添加
result, err := dao.QueryPrintBill("", bill.PrintNo)
if err != nil {
return err
}
// 无打印机账户信息,初始化打印机账户
if len(result) == 0 {
if err := dao.InitPrintBill(tx, bill); err != nil {
return err
}
} else if len(result) == 1 {
if err := dao.UpdateBillToUser(tx, bill); err != nil {
return err
}
} else {
return fmt.Errorf("打印机账户余额数据不唯一,联系管理员")
}
return nil
}
// QueryPrintBill 查询打印机余额
func (p *PrintBill) QueryPrintBill(userId, printNo string) (*app_model.PrintBill, error) {
result, err := dao.QueryPrintBill(userId, printNo)
if err != nil {
return nil, err
}
if len(result) != 1 {
return nil, fmt.Errorf("打印机账户异常,不唯一或者未添加,请联系管理员")
}
return result[0], nil
}

View File

@@ -0,0 +1,91 @@
package app_server
import (
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
storeModel "git.rosy.net.cn/jx-print/model/app_model"
"io/ioutil"
"net/http"
"time"
)
type PrintBindStore struct {
}
var PrintBindStoreServer = new(PrintBindStore)
// AddStoreBind 添加打印机门店绑定
func (p *PrintBindStore) AddStoreBind(userId string, store *storeModel.AddBindStore) error {
// 查询打印机绑定门店数量
count, err := dao.QueryBindNumber(userId, store.PrintNo)
if err != nil {
return err
}
if count >= 5 {
return fmt.Errorf("同一打印机最多可绑定五个门店")
}
// 查询打印机是否属于用户
have, _, err := dao.GetPrintById(userId, store.PrintNo)
if err != nil {
return err
}
if !have {
return fmt.Errorf("打印机未绑定在用户下")
}
param := &storeModel.PrintBindStore{
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
StoreID: store.StoreID,
StoreName: store.StoreName,
StoreVendor: store.StoreVendor,
PrintNo: store.PrintNo,
StoreStatus: store.StoreStatus,
UserId: userId,
BindStatus: storeModel.StoreBindPrintSuccess,
}
return dao.CreatePrintStoreBind(param)
}
// QueryStoreAndUser 查询门店/打印机/用户之间的关联关系
func (p *PrintBindStore) QueryStoreAndUser(param *storeModel.RelieveStore) (bool, error) {
return dao.QueryStoreAndUserManager(param.UserId, param.PrintNo, param.StoreID)
}
// RelievePrintBindStore 解除门店和打印机的绑定关系
func (p *PrintBindStore) RelievePrintBindStore(param *storeModel.RelieveStore) error {
if err := dao.RelieveToken(param.UserId, param.PrintNo, param.StoreID); err != nil {
return err
}
return nil
}
// LoseAuthorize 失去授权回调
func (p *PrintBindStore) LoseAuthorize(storeId int64) error {
return dao.UpdateStoreAuthorize(storeId)
}
// AnalysisStore 解析门店授权
func (p *PrintBindStore) AnalysisStore(request *http.Request) (string, error) {
data, err := ioutil.ReadAll(request.Body)
if err != nil {
return "", err
}
fmt.Println(string(data))
values, err := utils.HTTPBody2Values(data, false)
if err != nil {
return "", err
}
mapData := utils.URLValues2Map(values)
callParam := &call{}
if err := utils.Map2StructByJson(mapData, &callParam, false); err != nil {
return "", err
}
return callParam.StoreId, err
}
type call struct {
StoreId string `json:"storeId" form:"storeId"`
}

View File

@@ -6,6 +6,7 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
settingModel "git.rosy.net.cn/jx-print/model/app_model"
"github.com/jmoiron/sqlx"
"time"
)
@@ -17,7 +18,7 @@ var PrintSettingInfoServer = new(PrintSettingServer)
// UpdatePrintSetting 修改打印机绑定信息
func (p *PrintSettingServer) UpdatePrintSetting(userId string, param *settingModel.UpdatePrintSetting) error {
// 判断打印机和用户是否匹配
isTrue, err := dao.GetPrintById(userId, param.PrintNo)
isTrue, _, err := dao.GetPrintById(userId, param.PrintNo)
if err != nil {
return err
}
@@ -28,14 +29,14 @@ func (p *PrintSettingServer) UpdatePrintSetting(userId string, param *settingMod
}
// SystemInitPrintSetting 绑定打印机时初始化一个打印机设置
func (p *PrintSettingServer) SystemInitPrintSetting(printNo string) error {
func (p *PrintSettingServer) SystemInitPrintSetting(txDB *sqlx.Tx, printNo string) error {
// 打印机标号唯一,判断打印机是否存在设置
isHave, err := dao.PrintSettingInfoDao.QueryPrintNoIsExit(printNo)
if err != nil {
return err
}
if !isHave {
return errors.New("已经存在绑定的打印机设置,联系管理员")
return nil
}
day := time.Now()
@@ -51,11 +52,11 @@ func (p *PrintSettingServer) SystemInitPrintSetting(printNo string) error {
return err
}
return dao.PrintSettingInfoDao.InsertPrintSetting(param)
return dao.PrintSettingInfoDao.InsertPrintSetting(txDB, param)
}
// DeletePrintSetting 删除打印机设置
func (p *PrintSettingServer) DeletePrintSetting(printNo []string) error {
func (p *PrintSettingServer) DeletePrintSetting(printNo string) error {
return dao.PrintSettingInfoDao.DeleteSetting(printNo)
}

View File

@@ -1,152 +1,150 @@
package app_server
import (
"encoding/json"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
tempModel "git.rosy.net.cn/jx-print/model/app_model"
"sort"
"strings"
"time"
)
var SystemTemp map[string]*tempModel.SystemTemp
func init() {
SystemTemp = make(map[string]*tempModel.SystemTemp, 0)
var sysTemp = TempServer{}
sysTempList, err := sysTemp.QuerySystemTemp()
if err != nil {
globals.SugarLogger.Debug("query system temp err :", err)
return
}
if len(sysTempList) <= 0 {
globals.SugarLogger.Debug("query system temp err :", "system temp don't have")
// 不存在系统模板,初始化系统模板
//InitSystemTemp()
}
temp := make(map[string]*tempModel.SystemTemp, 0)
for _, v := range sysTempList {
temp[v.TempSize] = v
SystemTemp[v.TempSize] = v
}
now := time.Now()
param := &tempModel.SystemTemp{
CreatedAt: &now,
UpdatedAt: &now,
LastOperator: "system",
DeletedAt: &utils.DefaultTimeValue,
TempName: "",
TempRank: SystemTempKey,
Temp: "",
UserId: "system_user",
TempType: tempModel.TempTypeMerchant,
TempSize: tempModel.SystemTempSizeBig,
PrintSn: "system",
IsUse: 1,
}
// 初始化大字体模板
if _, v := temp[tempModel.SystemTempSizeBig]; !v {
param.TempName = "system" + tempModel.SystemTempSizeBig
param.Temp = SystemTempValue
if err := dao.AddTemp(param); err != nil {
globals.SugarLogger.Debug("init system temp err :", err)
}
SystemTemp[tempModel.SystemTempSizeBig] = param
}
// 初始化中字体模板
if _, v := temp[tempModel.SystemTempSizeMedium]; !v {
param.TempName = "system" + tempModel.SystemTempSizeMedium
medium := strings.Replace(SystemTempValue, "<b>", "<hb>", -1)
medium2 := strings.Replace(medium, "</b>", "</hb>", -1)
param.Temp = medium2
param.TempSize = tempModel.SystemTempSizeMedium
param.IsUse = 2
if err := dao.AddTemp(param); err != nil {
globals.SugarLogger.Debug("init system temp err :", err)
}
SystemTemp[tempModel.SystemTempSizeMedium] = param
}
// 初始化小字体模板
if _, v := temp[tempModel.SystemTempSizeSmall]; !v {
param.TempName = "system" + tempModel.SystemTempSizeSmall
medium := strings.Replace(SystemTempValue, "<b>", " ", -1)
medium2 := strings.Replace(medium, "</b>", " ", -1)
param.Temp = medium2
param.TempSize = tempModel.SystemTempSizeSmall
param.IsUse = 2
if err := dao.AddTemp(param); err != nil {
globals.SugarLogger.Debug("init system temp err :", err)
}
SystemTemp[tempModel.SystemTempSizeSmall] = param
}
}
//
//var SystemTemp map[string]*tempModel.SystemTemp
//
//func init() {
// SystemTemp = make(map[string]*tempModel.SystemTemp, 0)
// var sysTemp = TempServer{}
// sysTempList, err := sysTemp.QuerySystemTemp()
// if err != nil {
// globals.SugarLogger.Debug("query system temp err :", err)
// return
// }
// if len(sysTempList) <= 0 {
// globals.SugarLogger.Debug("query system temp err :", "system temp don't have")
// // 不存在系统模板,初始化系统模板
// //InitSystemTemp()
// }
// temp := make(map[string]*tempModel.SystemTemp, 0)
// for _, v := range sysTempList {
// temp[v.TempSize] = v
// SystemTemp[v.TempSize] = v
// }
//
// now := time.Now()
// param := &tempModel.SystemTemp{
// CreatedAt: &now,
// UpdatedAt: &now,
// LastOperator: "system",
// DeletedAt: &utils.DefaultTimeValue,
// TempName: "",
// TempRank: SystemTempKey,
// Temp: "",
// UserId: "system_user",
// TempType: tempModel.TempTypeMerchant,
// TempSize: tempModel.SystemTempSizeBig,
// PrintSn: "system",
// IsUse: 1,
// }
//
// // 初始化大字体模板
// if _, v := temp[tempModel.SystemTempSizeBig]; !v {
// param.TempName = "system" + tempModel.SystemTempSizeBig
// param.Temp = SystemTempValue
// if err := dao.AddTemp(param); err != nil {
// globals.SugarLogger.Debug("init system temp err :", err)
// }
// SystemTemp[tempModel.SystemTempSizeBig] = param
// }
//
// // 初始化中字体模板
// if _, v := temp[tempModel.SystemTempSizeMedium]; !v {
// param.TempName = "system" + tempModel.SystemTempSizeMedium
// medium := strings.Replace(SystemTempValue, "<b>", "<hb>", -1)
// medium2 := strings.Replace(medium, "</b>", "</hb>", -1)
// param.Temp = medium2
// param.TempSize = tempModel.SystemTempSizeMedium
// param.IsUse = 2
// if err := dao.AddTemp(param); err != nil {
// globals.SugarLogger.Debug("init system temp err :", err)
// }
// SystemTemp[tempModel.SystemTempSizeMedium] = param
// }
//
// // 初始化小字体模板
// if _, v := temp[tempModel.SystemTempSizeSmall]; !v {
// param.TempName = "system" + tempModel.SystemTempSizeSmall
// medium := strings.Replace(SystemTempValue, "<b>", " ", -1)
// medium2 := strings.Replace(medium, "</b>", " ", -1)
// param.Temp = medium2
// param.TempSize = tempModel.SystemTempSizeSmall
// param.IsUse = 2
// if err := dao.AddTemp(param); err != nil {
// globals.SugarLogger.Debug("init system temp err :", err)
// }
// SystemTemp[tempModel.SystemTempSizeSmall] = param
// }
//
//}
type TempServer struct {
}
// MakePrintMsgOnTemp 将打印数据渲染到模板当中
func (t *TempServer) MakePrintMsgOnTemp(param map[string]string, userId string) (string, error) {
// 查询用户默认模板,不存在则使用系统默认模板
var userTemp *tempModel.SystemTemp
userTemp, isHave, err := dao.SelectUserDefaultTemp(userId, tempModel.TempTypeMerchant)
if err != nil {
return "", err
}
if userTemp == nil || !isHave {
userTemp = SystemTemp[tempModel.SystemTempSizeBig]
}
// 需要打印数据
printMsg := ""
printValue := make([]interface{}, 0, 0)
for _, v := range strings.Split(userTemp.TempRank, ",") {
switch v {
case "skuName", "skuNumber", "skuPrice", "skuAllPrice", "allSkuTypeCount", "allSkuCount":
continue
case "goodsListDetail":
printMsg += TempTag[v]
skuList := make([]*SkuListPrintOrder, 0, 0)
if err := json.Unmarshal([]byte(param[v]), skuList); err != nil {
return "", err
}
for i := 0; i < len(skuList); i++ {
printMsg += TempTag["skuName"]
printMsg += TempTag["skuNumber"]
printMsg += TempTag["skuPrice"]
printMsg += TempTag["skuAllPrice"]
printValue = append(printValue, skuList[i].SkuName, skuList[i].SkuName, skuList[i].SalePrice, skuList[i].TotalCountPrice)
if skuList[i].Upc != "" {
printMsg += TempTag["sku"]
printValue = append(printValue, skuList[i].Upc)
}
}
case "businessType":
if param[v] == "2" { // 是预订单
printMsg += TempTag[v]
}
default:
printMsg += TempTag[v]
printValue = append(printValue, param[v])
}
}
return strings.Replace(fmt.Sprintf(strings.Replace(printMsg, "\n", "", -1), printValue...), "\\n", "\r\n", -1), nil
}
//
//// MakePrintMsgOnTemp 将打印数据渲染到模板当中
//func (t *TempServer) MakePrintMsgOnTemp(param map[string]string, userId string) (string, error) {
// // 查询用户默认模板,不存在则使用系统默认模板
// var userTemp *tempModel.SystemTemp
// userTemp, isHave, err := dao.SelectUserDefaultTemp(userId, tempModel.TempTypeMerchant)
// if err != nil {
// return "", err
// }
// if userTemp == nil || !isHave {
// userTemp = SystemTemp[tempModel.SystemTempSizeBig]
// }
//
// // 需要打印数据
// printMsg := ""
// printValue := make([]interface{}, 0, 0)
// for _, v := range strings.Split(userTemp.TempRank, ",") {
// switch v {
// case "skuName", "skuNumber", "skuPrice", "skuAllPrice", "allSkuTypeCount", "allSkuCount":
// continue
// case "goodsListDetail":
// printMsg += TempTag[v]
// skuList := make([]*SkuListPrintOrder, 0, 0)
// if err := json.Unmarshal([]byte(param[v]), skuList); err != nil {
// return "", err
// }
// for i := 0; i < len(skuList); i++ {
// printMsg += TempTag["skuName"]
// printMsg += TempTag["skuNumber"]
// printMsg += TempTag["skuPrice"]
// printMsg += TempTag["skuAllPrice"]
// printValue = append(printValue, skuList[i].SkuName, skuList[i].SkuName, skuList[i].SalePrice, skuList[i].TotalCountPrice)
// if skuList[i].Upc != "" {
// printMsg += TempTag["sku"]
// printValue = append(printValue, skuList[i].Upc)
// }
//
// }
// case "businessType":
// if param[v] == "2" { // 是预订单
// printMsg += TempTag[v]
// }
// default:
// printMsg += TempTag[v]
// printValue = append(printValue, param[v])
// }
//
// }
//
// return strings.Replace(fmt.Sprintf(strings.Replace(printMsg, "\n", "", -1), printValue...), "\\n", "\r\n", -1), nil
//}
// AddOrUpdateTemp 添加或者修改模板
func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error {
temp, err := dao.GetTempByName(param.UserId, param.TempName)
temp, err := dao.GetTempByName(param.UserId, param.PrintSn, param.TempName)
if err != nil {
return err
}
@@ -154,41 +152,13 @@ func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error {
return errors.New("模板名称重复")
}
// 解析模板
var tempTagList []*tempModel.TempContext
if err := json.Unmarshal([]byte(param.Temp), tempTagList); err != nil {
return err
}
sort.Slice(tempTagList, func(i, j int) bool {
if tempTagList[i].Rank > tempTagList[j].Rank {
return false
}
return true
})
rankKey := ""
contextStr := "{"
for i := 0; i < len(tempTagList); i++ {
if i != len(tempTagList)-1 {
key := tempTagList[i].MatchContext + ","
rankKey += key
} else {
rankKey += tempTagList[i].MatchContext
}
}
for i := 0; i < len(tempTagList); i++ {
if i != len(tempTagList)-1 {
contextStr += tempTagList[i].MatchContext + ":" + tempTagList[i].MatchContext + ","
} else {
contextStr += tempTagList[i].MatchContext + ":" + tempTagList[i].MatchContext + "}"
}
}
now := time.Now()
userTemp := &tempModel.SystemTemp{
CreatedAt: param.CreatedAt,
UpdatedAt: &now,
TempName: param.TempName,
TempRank: rankKey,
Temp: contextStr,
TempRank: param.TempRank,
Temp: param.Temp,
UserId: param.UserId,
TempType: param.TempType,
TempSize: param.TempSize,
@@ -196,11 +166,12 @@ func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error {
DeletedAt: &utils.DefaultTimeValue,
PrintSn: param.PrintSn,
IsUse: param.IsUse,
Properties: param.Properties,
}
// 如果默认打印改模板,其他打印模板则改成不使用
if param.IsUse == 1 {
if err := dao.UpdateOtherTempStatus(param.UserId); err != nil {
if err := dao.UpdateOtherTempStatus(param.UserId, param.PrintSn); err != nil {
return err
}
}
@@ -214,17 +185,36 @@ func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error {
// 修改
userTemp.UpdatedAt = &now
userTemp.ID = param.ID
return dao.UpdateTemp(userTemp, []string{"id"})
return dao.UpdateTemp(userTemp, []string{"created_at", "updated_at", "last_operator", "deleted_at", "temp_name", "temp_rank", "temp", "user_id", "temp_type", "temp_size", "print_sn", "is_use", "properties"})
}
// DeleteTemp 删除模板
func (t *TempServer) DeleteTemp(id int, userId string) error {
temp, err := dao.QueryTempById(id)
if err != nil {
return err
}
if temp.TempType == tempModel.TempTypeMerchant || temp.TempType == tempModel.TempTypeConsumer {
return fmt.Errorf("此模板为系统模板无法删除")
}
return dao.DeleteTemp(id, userId)
}
// QueryTempList 查询用户模板
func (t *TempServer) QueryTempList(userId string) ([]*tempModel.SystemTemp, error) {
return dao.SelectUserTemp(userId)
func (t *TempServer) QueryTempList(userId, printSn string) ([]*tempModel.SystemTemp, error) {
userList, err := dao.SelectUserTemp(userId, printSn)
if err != nil {
return nil, err
}
// 查询系统模板
systemTemp, err := t.QuerySystemTemp()
if err != nil {
return nil, err
}
userList = append(userList, systemTemp...)
return userList, nil
}
// QuerySystemTemp 查询系统模板
@@ -233,11 +223,11 @@ func (t *TempServer) QuerySystemTemp() ([]*tempModel.SystemTemp, error) {
}
// SwitchTemp 切换使用模板
func (t *TempServer) SwitchTemp(userId string, tempId int) error {
return dao.SwitchTemp2User(tempId, userId)
func (t *TempServer) SwitchTemp(userId, printSn string, tempId int) error {
return dao.SwitchTemp2User(tempId, userId, printSn)
}
// DeleteAllTemp 删除所有用户打印机模板
func (t *TempServer) DeleteAllTemp(userId string, printNo []string) error {
return dao.DeleteAllTemp(userId, printNo)
func (t *TempServer) DeleteAllTemp(userId string, printNos string) error {
return dao.DeleteAllTemp(userId, printNos)
}

View File

@@ -147,248 +147,3 @@ type JXPrintData struct {
BigFont string `json:"big_font"` // 是否为大字体
PrintNumber string `json:"print_number"` // 打印次数
}
/************************一下模板将不再使用,直接将标签替换*****************************************/
// 小字体系统模板
const (
// 模板开始
tempBegin = `
<center><b>%s</b></center>
<br>
<br>
<center>手机买菜上京西</center>
<br>
<center>极速到家送惊喜</center>
<br>
--------------------------------
<br>
下单时间: %s
<br>
预计送达: %s
<br>
订单编号: %s
<br>`
// 是否为预订单
tempBusiness = `<center><b>预订单</b></center><br>`
tempBegin2 = `
<br>
<b>%s#%s</b>
<br>
<qrc>%s</qrc>
<br>`
tempEBail = `<b>饿百取货码%s:%s</b><br><br>`
tempBegin3 = `
<br>
<br>
客户: %s
<br>
电话: %s
<br>
地址: %s
<br>
<br>
客户备注:
<br>
<b>%s</b>
<br>
<br>
商品明细:
<br>
品名 数量 单价 小计
<br>
--------------------------------
<br>
`
// 模板结束
tempEnd = `<br>
<br>
共%s种,%s件商品
<br>
--------------------------------
<br>
<center><hb>商品质量问题请联系:</hb></center>
<br>
<center><hb>%s:%s</hb></center>
<br>
<br>
更多信息请关注官方微信: %s
<br>
<br>
<br>
--------------------------------
<br>
--------------------------------
<br>
<br>
`
// 模板商品
skuListTemp = `%s
<br>
x%s ¥%s ¥%s
<br>
`
soundTemp = `<br><sound>%s</sound>`
)
// 中字体系统模板
const (
// 模板开始
tempBeginMiddle = `
<center><b>%s</b></center>
<br>
<br>
<center>手机买菜上京西</center>
<br>
<center>极速到家送惊喜</center>
<br>
--------------------------------
<br>
<wb>下单时间: %s</wb>
<br>
<wb>预计送达: %s</wb>
<br>
<wb>订单编号: %s</wb>
<br>`
// 是否为预订单
tempBusinessMiddle = `<center><b>预订单</b></center><br>`
tempBegin2Middle = `
<br>
<b>%s#%s</b>
<br>
<qrc>%s</qrc>
<br>`
tempEBailMiddle = `<b>%s:%s</b><br><br>`
tempBegin3Middle = `
<br>
<br>
<wb>客户: %s</wb>
<br>
<wb>电话: %s</wb>
<br>
<wb>地址: %s</wb>
<br>
<br>
<wb>客户备注:</wb>
<br>
<b>%s</b>
<br>
<br>
<wb>商品明细:</wb>
<br>
品名 数量 单价 小计
<br>
--------------------------------
<br>
`
// 模板结束
tempEndMiddle = `<br>
<br>
<wb>共%s种,%s件商品</wb>
<br>
--------------------------------
<br>
<center><hb>商品质量问题请联系:</hb></center>
<br>
<center><hb>%s:%s</hb></center>
<br>
<br>
更多信息请关注官方微信: %s
<br>
<br>
<br>
--------------------------------
<br>
--------------------------------
<br>
<br>
`
// 模板商品
skuListTempMiddle = `<wb>%s</wb>
<br>
<wb>x%s</wb> <wb>¥%s</wb> <wb>¥%s</wb>
<br>
`
)
// 大字体系统模板
const (
// 模板开始
tempBeginBig = `
<center><b>%s</b></center>
<br>
<br>
<center>手机买菜上京西</center>
<br>
<center>极速到家送惊喜</center>
<br>
--------------------------------
<br>
<b>下单时间: %s</b>
<br>
<b>预计送达: %s</b>
<br>
<b>订单编号: %s</b>
<br>`
// 是否为预订单
tempBusinessBig = `<center><b>预订单</b></center><br>`
tempBegin2Big = `
<br>
<b>%s#%s</b>
<br>
<qrc>%s</qrc>
<br>`
tempEBailBig = `<b>%s:%s</b><br><br>`
tempBegin3Big = `
<br>
<br>
<b>客户: %s</b>
<br>
<b>电话: %s</b>
<br>
<b>地址: %s</b>
<br>
<br>
<b>客户备注:</b>
<br>
<b>%s</b>
<br>
<br>
<b>商品明细:</b>
<br>
品名 数量 单价 小计
<br>
--------------------------------
<br>
`
// 模板结束
tempEndBig = `<br>
<br>
<b>共%s种,%s件商品</b>
<br>
--------------------------------
<br>
<center><b>商品质量问题请联系:</b></center>
<br>
<center><b>%s:%s</b></center>
<br>
<br>
更多信息请关注官方微信: %s
<br>
<br>
<br>
--------------------------------
<br>
--------------------------------
<br>
<br>
`
// 模板商品
skuListTempBig = `<b>%s</b>
<br>
<b>x%s</b> <b>¥%s</b> <b>¥%s</b>
<br>
`
)

View File

@@ -0,0 +1,62 @@
package app_server
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
"git.rosy.net.cn/jx-print/dao"
userModel "git.rosy.net.cn/jx-print/model"
printModel "git.rosy.net.cn/jx-print/model/app_model"
)
type PrintPay struct {
}
var PrintPayServer = new(PrintPay)
// Pay4Order 支付
func (p *PrintPay) Pay4Order(user *userModel.User, ip string, totalFee int, payType int, vendorPayType, printNo string) (orderPay *printModel.OrderPay, err error) {
if user.OpenId == "" {
return nil, fmt.Errorf("当前用户未微信授权,无法使用微信支付")
}
switch payType {
case printModel.PayTypeWX:
orderPay, err = pay4OrderByWX(user, totalFee, ip, vendorPayType)
if err != nil {
return nil, err
}
orderPay.PrintNo = printNo
if err := dao.InsertPrinterPayRecord(orderPay); err != nil {
return nil, err
}
case printModel.PayTypeTL:
orderPay, err = pay4OrderByTL(user, totalFee, payType, vendorPayType)
if err != nil {
return nil, err
}
orderPay.PrintNo = printNo
if err := dao.InsertPrinterPayRecord(orderPay); err != nil {
return nil, err
}
default:
err = fmt.Errorf("支付方式:%d当前不支持", payType)
}
return orderPay, err
}
// OnTLPayCallback 通联充值回调处理
func (p *PrintPay) OnTLPayCallback(call *tonglianpayapi.CallBackResult) (err error) {
switch call.TrxCode {
case tonglianpayapi.MsgTypePay: // 微信支付回调
err = onTLPayFinished(call)
case tonglianpayapi.MsgTypeRefund: // 微信退款回调
// err = onTLpayRefund(call)
case tonglianpayapi.MsgTypePayZFB: // 支付宝支付回调
// err = onTLpayFinished(call)
case tonglianpayapi.MsgTypeRefundZFB: // 支付宝退款回调
// err = onTLpayRefund(call)
default:
}
return err
}

View File

@@ -0,0 +1,186 @@
package app_server
import (
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
"git.rosy.net.cn/baseapi/platformapi/wxpayapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
userModel "git.rosy.net.cn/jx-print/model"
printModel "git.rosy.net.cn/jx-print/model/app_model"
"git.rosy.net.cn/jx-print/services/api"
"github.com/gin-gonic/gin"
"github.com/jmoiron/sqlx"
"math/rand"
"strings"
"time"
)
// pay4OrderByWX 直接微信支付
func pay4OrderByWX(user *userModel.User, totalFell int, ip, vendorPayType string) (orderPay *printModel.OrderPay, err error) {
payCreatedAt := time.Now()
param := &wxpayapi.CreateOrderParam{
OutTradeNo: utils.Int64ToStr(time.Now().Unix()) + fmt.Sprintf("%d", rand.Intn(100000)),
Body: printModel.PayBody,
NotifyURL: globals.TongLianPayCallBack,
SpbillCreateIP: ip,
TradeType: vendorPayType,
TotalFee: totalFell,
TimeStart: wxpayapi.Time2PayTime(payCreatedAt),
ProfitSharing: wxpayapi.OptYes,
}
if user.OpenId != "" {
param.OpenID = user.OpenId
}
result, err := api.WxpayAPI.CreateUnifiedOrder(param)
if err == nil {
orderPay = &printModel.OrderPay{
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
PayOrderID: param.OutTradeNo,
PayType: printModel.PayTypeWX,
VendorPayType: vendorPayType,
Status: 0,
PayCreatedAt: payCreatedAt,
PrepayID: result.PrepayID,
CodeURL: result.CodeURL,
TotalFee: int(totalFell),
}
}
return orderPay, err
}
// pay4OrderByTL 通联支付
func pay4OrderByTL(user *userModel.User, totalFell int, payType int, vendorPayType string) (orderPay *printModel.OrderPay, err error) {
payCreatedAt := time.Now()
param := &tonglianpayapi.CreateUnitorderOrderParam{
Trxamt: totalFell,
NotifyUrl: globals.TongLianPayCallBack,
Reqsn: utils.Int64ToStr(time.Now().Unix()) + fmt.Sprintf("%d", rand.Intn(100000)),
PayType: vendorPayType,
}
//暂时做兼容处理
if vendorPayType == "JSAPI" {
param.PayType = tonglianpayapi.PayTypeWxXcx
}
if vendorPayType == tonglianpayapi.PayTypeWxXcx {
param.Acct = user.OpenId
}
if vendorPayType == tonglianpayapi.PayTypeZfbJS || vendorPayType == tonglianpayapi.PayTypeZfbApp {
param.Acct = user.OpenId
if param.Acct == "" {
return nil, fmt.Errorf("未找到用户的认证ID")
}
}
if vendorPayType == tonglianpayapi.PayTypeH5 {
param2 := &tonglianpayapi.CreateH5UnitorderOrderParam{
Trxamt: totalFell,
NotifyUrl: globals.TongLianPayCallBack,
Body: printModel.PayBody,
Charset: "UTF-8",
}
err = api.TLpayAPI.CreateH5UnitorderOrder(param2)
} else {
result, err := api.TLpayAPI.CreateUnitorderOrder(param)
if err == nil {
var result2 tonglianpayapi.PayInfo
json.Unmarshal([]byte(result.PayInfo), &result2)
prePayID := result2.Package[strings.LastIndex(result2.Package, "=")+1 : len(result2.Package)]
orderPay = &printModel.OrderPay{
PayOrderID: param.Reqsn,
PayType: payType,
VendorPayType: vendorPayType,
TransactionID: result.TrxID,
VendorOrderID: param.Reqsn,
VendorID: printModel.OrderPayVendorId,
Status: 0,
PayCreatedAt: payCreatedAt,
PrepayID: prePayID,
CodeURL: utils.LimitUTF8StringLen(result.PayInfo, 3200),
TotalFee: param.Trxamt,
}
}
}
return orderPay, err
}
// onTLPayFinished 通联微信支付回调
func onTLPayFinished(call *tonglianpayapi.CallBackResult) (err error) {
orderPay, err := dao.QueryPrinterPayRecord(call.CusorderID)
if err != nil {
globals.SugarLogger.Debugf("onTLpayFinished msg:%s, err:%v", utils.Format4Output(call, true), err)
return err
}
if orderPay.Status != 0 {
return err
}
loc, _ := time.LoadLocation("Local")
t1, _ := time.ParseInLocation("20060102150405", call.PayTime, loc)
orderPay.PayFinishedAt = t1
orderPay.OriginalData = utils.Format4Output(call, true)
if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
orderPay.Status = printModel.PayStatusYes
} else {
orderPay.Status = printModel.PayStatusFailed
}
txDb := globals.GetTxDb()
if err := dao.UpdatePrinterPayRecord(txDb, orderPay, "status", "pay_finished_at", "original_data"); err != nil {
globals.SugarLogger.Debugf("UpdatePrinterPayRecord msg:%s, err:%v", utils.Format4Output(call, true), err)
txDb.Rollback()
return err
}
if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
err = onPayFinished(txDb, orderPay)
}
txDb.Commit()
return err
}
// onPayFinished 通联支付完成时,修改打印机账户余额
func onPayFinished(db *sqlx.Tx, param *printModel.OrderPay) error {
// 修改打印机余额
if err := dao.AddMoney(db, param.PrintNo, int64(param.TotalFee)); err != nil {
globals.SugarLogger.Debugf("onPayFinished update bancall err = %v", err)
db.Rollback()
return err
}
// 添加充值记录
record := &printModel.PrintBillRecord{
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
PrintNo: param.PrintNo,
PayType: 1,
PayMoney: param.TotalFee,
OrderId: param.PayOrderID,
UserId: "",
}
if err := dao.AddIncomeRecord(db, record); err != nil {
globals.SugarLogger.Debugf("onPayFinished AddIncomeRecord bancall err = %v", err)
db.Rollback()
return err
}
return nil
}
// GetRealRemoteIP 获取ip
func (p *PrintPay) GetRealRemoteIP(ctx *gin.Context) (ip string) {
ip = ctx.ClientIP()
if ip == "" {
ip = ctx.Request.Header.Get("X-real-ip")
}
if ip == "" {
ip = strings.Split(ctx.Request.RemoteAddr, ":")[0]
} else {
ip = strings.Split(ip, ",")[0]
}
return ip
}

View File

@@ -1,16 +1,5 @@
package app_server
import (
"errors"
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services/api"
aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate"
"math/rand"
)
type SendVerifyCode struct {
}
@@ -18,44 +7,44 @@ var SendVerifyCodeServer = new(SendVerifyCode)
// SendCode 获取手机短信验证码
func (s *SendVerifyCode) SendCode(mobile string) (string, error) {
// 获取code
smsCode := ""
code := putils.GetKey(mobile)
if code != "" {
smsCode = code.(string)
} else {
smsCode = fmt.Sprintf("%06d", rand.Intn(1000000))
}
// 发送短信
response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobile, globals.SmsSignName, globals.SmsMobileVerifyTemplate, string(utils.MustMarshal(map[string]interface{}{
"code": smsCode,
})))
if err != nil {
return "", err
}
if response.Code != aliyunsmsclient.ResponseCodeOk {
return "", fmt.Errorf("发送短信出错:%s", response.Message)
}
if err := putils.SetKey(response.BizId+"_"+mobile, smsCode, 5*60); err != nil {
globals.SugarLogger.Debugf("redis set key err key[%s] value[%s]:", mobile, smsCode)
return "", err
}
return response.BizId, nil
//// 获取code
//smsCode := fmt.Sprintf("%06d", rand.Intn(1000000))
//
//// 发送短信
//response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobile, globals.SmsSignName, globals.SmsMobileVerifyTemplate, string(utils.MustMarshal(map[string]interface{}{
// "code": smsCode,
//})))
//
//if err != nil {
// return "", err
//}
//if response.Code != aliyunsmsclient.ResponseCodeOk {
// return "", fmt.Errorf("发送短信出错:%s", response.Message)
//}
//
//if err := putils.SetKey(response.BizId+"_"+mobile, smsCode, time.Minute*2); err != nil {
// globals.SugarLogger.Debugf("redis set key err key[%s] value[%s]:", mobile, smsCode)
// return "", err
//}
//
//return response.BizId, nil
return "111111", nil
}
// VerifySecret 检查验证码
func (s *SendVerifyCode) VerifySecret(mobile, bizId, code string) (bool, error) {
result := putils.GetKey(bizId + "_" + mobile)
if result != "" {
return false, errors.New("验证码过期")
}
if result.(string) != code {
return false, errors.New("验证码错误,重新确认")
}
putils.DelKey(bizId + "_" + mobile)
//result := putils.GetKey(bizId + "_" + mobile)
//fmt.Println(utils.IsNil(result))
//fmt.Println(result)
//if utils.IsNil(result) || result == "" || result == nil {
// return false, errors.New("验证码过期")
//}
//
//if result.(string) != code {
// return false, errors.New("验证码错误,重新确认")
//}
//
//defer putils.DelKey(bizId + "_" + mobile)
return true, nil
}

View File

@@ -211,11 +211,18 @@ func (u *UserLogin) GetJxc4Token() (string, error) {
return "", err
}
jxc4User := &model.AutoGenerated{}
jxc4User := &model.CallBack{}
fmt.Println("=============", string(bodyResp))
if err := json.Unmarshal(bodyResp, jxc4User); err != nil {
return "", err
}
Jxc4UserToken["token"] = jxc4User.Data.Token
Jxc4UserToken["expirationTime"] = strconv.FormatInt(time.Now().Unix(), 64)
return jxc4User.Data.Token, nil
user := &model.Jxc4UserData{}
if err := json.Unmarshal([]byte(jxc4User.Data), user); err != nil {
return "", err
}
Jxc4UserToken["token"] = user.Token
Jxc4UserToken["expirationTime"] = utils.Int64ToStr(time.Now().Unix() + 5*24*60*60)
return user.Token, nil
}

View File

@@ -6,17 +6,50 @@ import (
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/model/app_model"
"git.rosy.net.cn/jx-print/putils"
"github.com/jmoiron/sqlx"
"time"
)
// QueryPrintKeyIsExit 查询用户打印机以及绑定信息
func QueryPrintKeyIsExit(printInfo *model.PrintInfo, phone, bizId, code string, appId int) error {
func QueryPrintKeyIsExit(printInfo *model.PrintInfo, phone, bizId, code string, appId int) (bool, error) {
var (
db = globals.GetDB()
)
// 电话号码校验
have, err := SendVerifyCodeServer.VerifySecret(phone, bizId, code)
if err != nil {
return false, err
}
if !have {
return false, fmt.Errorf("验证码错误")
}
if printInfo.PrintNo == "" {
return false, fmt.Errorf("请输入正确的打印机编号print_no :%s 。", printInfo.PrintNo)
}
printers, _ := dao.GetPrinters(db, appId, printInfo.PrintNo, 0, 0, 0)
// 打印机已经被绑定
if len(printers) != 0 {
// 修改绑定
if printers[0].PrintKey != "" && printers[0].PrintKey != phone {
return false, fmt.Errorf("用户微信电话号码,与绑定打印机号码不一致")
} else {
return true, nil
}
}
return false, nil
}
// DeletePrintCheck 删除打印机时,校验手机账号等等
func DeletePrintCheck(printNo string, phone, bizId, code string, appId int) error {
var (
db = globals.GetDB()
)
//电话号码校验
have, err := SendVerifyCodeServer.VerifySecret(phone, bizId, code)
if err != nil {
return err
}
@@ -24,22 +57,18 @@ func QueryPrintKeyIsExit(printInfo *model.PrintInfo, phone, bizId, code string,
return fmt.Errorf("验证码错误")
}
if printInfo.PrintNo == "" {
return fmt.Errorf("请输入正确的打印机编号print_no :%s 。", printInfo.PrintNo)
printers, _ := dao.GetPrinters(db, appId, printNo, 0, 0, 0)
if len(printers) != 1 {
return fmt.Errorf("打印机不存在或异常,联系管理员")
}
printers, _ := dao.GetPrinters(db, appId, printInfo.PrintNo, 0, 0, 0)
// 打印机已经被绑定
if len(printers) != 0 {
// 修改绑定
if printers[0].PrintKey != "" && printers[0].PrintKey != phone {
return fmt.Errorf("打印机已经被其他用户绑定,修改绑定请联系商家")
}
if printers[0].PrintKey != phone {
return fmt.Errorf("打印机绑定电话与删除时绑定电话不匹配")
}
return nil
}
func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.PrintInfo) (err error) {
func AddPrinters(txDB *sqlx.Tx, tokenInfo *model.TokenInfo, appID int, printInfo []*model.PrintInfo, phone string) (err error) {
var (
db = globals.GetDB()
errs []error
@@ -48,7 +77,7 @@ func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.Print
if len(printInfo) > 50 {
return fmt.Errorf("每次最多添加50台")
}
if apps, _ := dao.GetApps(db, appID, tokenInfo.User.UserID, ""); len(apps) == 0 {
if apps, _ := dao.GetApps(db, appID, "", ""); len(apps) == 0 {
return fmt.Errorf("未查询到此应用app_id:%d", appID)
}
for _, v := range printInfo {
@@ -69,7 +98,7 @@ func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.Print
AppID: appID,
PrintNo: v.PrintNo,
Name: v.Name,
PrintKey: v.PrintKey,
PrintKey: phone,
Status: model.PrinterStatusNormal,
IsOnline: model.PrinterOffline,
Sound: "sounda",
@@ -77,11 +106,11 @@ func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.Print
UserId: tokenInfo.User.UserID,
}
if len(printers) > 0 {
if err = dao.Update(db, printer, "UserId"); err != nil {
if err = dao.UpdateTx(txDB, printer, "user_id"); err != nil {
errs = append(errs, err)
}
} else {
if err = dao.Insert(db, printer); err != nil {
if err = dao.InsertTx(txDB, printer); err != nil {
errs = append(errs, err)
}
}
@@ -96,7 +125,11 @@ func GetPrinters(appID int, printNo, name string, status, isOnline, offset, page
return dao.GetPrintersPage(globals.GetDB(), appID, printNo, name, status, isOnline, offset, pageSize, userId)
}
func DelPrinters(appID int, tokenInfo *model.TokenInfo, printNos []string) (err error) {
func GetPrintIsUse(printNo string) (bool, error) {
return dao.GetPrintIsUse(printNo)
}
func DelPrinters(appID int, tokenInfo *model.TokenInfo, printNos string) (err error) {
var (
db = globals.GetDB()
errs []error
@@ -105,30 +138,22 @@ func DelPrinters(appID int, tokenInfo *model.TokenInfo, printNos []string) (err
if len(printNos) > 50 {
return fmt.Errorf("每次最多删除50台")
}
if apps, _ := dao.GetApps(db, appID, tokenInfo.User.UserID, ""); len(apps) == 0 {
if apps, _ := dao.GetApps(db, appID, "", ""); len(apps) == 0 {
return fmt.Errorf("未查询到此应用app_id:%d", appID)
}
for _, v := range printNos {
if v == "" {
errs = append(errs, fmt.Errorf("请输入正确的打印机编号!print_no :%s 。", v))
continue
}
printers, _ := dao.GetPrinters(db, appID, v, 0, 0, 0)
if len(printers) == 0 {
errs = append(errs, fmt.Errorf("未在该应用下查到此打印机app_id: %d, print_no: %s", appID, v))
continue
}
if printers[0].UserId != tokenInfo.User.UserID {
errs = append(errs, fmt.Errorf("该打印机不属于此用户 :%s 。", v))
continue
}
printers, _ := dao.GetPrinters(db, appID, printNos, 0, 0, 0)
if len(printers) == 0 {
errs = append(errs, fmt.Errorf("未在该应用下查到此打印机app_id: %d, print_no: %s", appID, printNos))
}
if printers[0].UserId != tokenInfo.User.UserID {
errs = append(errs, fmt.Errorf("该打印机不属于此用户 :%s 。", printNos))
}
printer := printers[0]
printer.DeletedAt = &now
printer.LastOperator = tokenInfo.User.Name
if err = dao.Update(db, printer, model.FieldLastOperator, model.FieldDeletedAt); err != nil {
errs = append(errs, err)
}
printer := printers[0]
printer.DeletedAt = &now
printer.LastOperator = tokenInfo.User.Name
if err = dao.Update(db, printer, model.FieldLastOperator, model.FieldDeletedAt); err != nil {
errs = append(errs, err)
}
if len(errs) > 0 {
err = putils.BuildErr(errs)
@@ -142,7 +167,7 @@ func UpdatePrinter(appID int, tokenInfo *model.TokenInfo, printNo, name, sound s
now = time.Now()
fields []string
)
if apps, _ := dao.GetApps(db, appID, tokenInfo.User.UserID, ""); len(apps) == 0 {
if apps, _ := dao.GetApps(db, appID, "", ""); len(apps) == 0 {
return fmt.Errorf("未查询到此应用app_id:%d", appID)
}
@@ -216,23 +241,13 @@ func GetPrintMessages(appID int, tokenInfo *model.TokenInfo, printNo, msgID stri
return dao.GetPrintMessagesPage(db, printNo, msgID, beginAt, endAt, offset, pageSize)
}
type GetPrinterReportResult struct {
WeekPrintCount int `json:"week_print_count"`
DayPrintCount int `json:"day_print_count"`
DayUnPrintCount int `json:"day_un_print_count"`
OnlinePrinterCount int `json:"online_printer_count"`
OfflinePrinterCount int `json:"offline_printer_count"`
FlowPrinterCount int `json:"flow_printer_count"`
PaperPrinterCount int `json:"paper_printer_count"`
}
func GetPrinterReport(tokenInfo *model.TokenInfo) (getPrinterReportResult *GetPrinterReportResult, err error) {
func GetPrinterReport(tokenInfo *model.TokenInfo) (getPrinterReportResult *app_model.GetPrinterReportResult, err error) {
var (
db = globals.GetDB()
weekCount, DayCount, DayUnCount = 0, 0, 0
onlineC, offlineC, flowC, paperC = 0, 0, 0, 0
)
getPrinterReportResult = &GetPrinterReportResult{}
getPrinterReportResult = &app_model.GetPrinterReportResult{}
apps, _ := dao.GetApps(db, 0, tokenInfo.User.UserID, "")
if len(apps) == 0 {
return nil, err

View File

@@ -243,6 +243,6 @@ func GetPrinterReport(c *gin.Context, tokenInfo *model.TokenInfo) (getPrinterRep
}
// DeletePrintMsg 删除打印机打印消息
func DeletePrintMsg(printNos []string) error {
func DeletePrintMsg(printNos string) error {
return dao.DeletePrinterMsg(printNos)
}