Merge remote-tracking branch 'origin/mark' into don

This commit is contained in:
Rosy-zhudan
2019-10-09 08:45:50 +08:00
20 changed files with 221 additions and 68 deletions

View File

@@ -47,6 +47,8 @@ func (r *RoleInfo) GetFullName() (fullRoleName string) {
} }
if r.StoreID > 0 { if r.StoreID > 0 {
strList = append(strList, StoreRolePrefix, utils.Int2Str(r.StoreID)) strList = append(strList, StoreRolePrefix, utils.Int2Str(r.StoreID))
} else if r.StoreID != 0 {
strList = append(strList, StoreRolePrefix, "")
} }
fullRoleName = strings.Join(strList, RoleNameSep) fullRoleName = strings.Join(strList, RoleNameSep)
return fullRoleName return fullRoleName

View File

@@ -72,11 +72,13 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
} }
} }
if existAfsOrder != nil { if existAfsOrder != nil {
// todo 可能导致状态回绕
existAfsOrder.Status = afsOrder.Status existAfsOrder.Status = afsOrder.Status
existAfsOrder.VendorStatus = afsOrder.VendorStatus existAfsOrder.VendorStatus = afsOrder.VendorStatus
if _, err = dao.UpdateEntity(db, existAfsOrder, "Status", "VendorStatus"); err != nil { if _, err = dao.UpdateEntity(db, existAfsOrder, "Status", "VendorStatus"); err != nil {
return err return err
} }
afsOrder = existAfsOrder
} else { } else {
// 全退都要先全删除再建 // 全退都要先全删除再建
if afsOrder.RefundType == model.AfsTypeFullRefund { if afsOrder.RefundType == model.AfsTypeFullRefund {

View File

@@ -228,7 +228,7 @@ func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toD
return nil, err return nil, err
} }
func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) { func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst bool, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) {
globals.SugarLogger.Debugf("getOrders from:%s to:%s", fromDateStr, toDateStr) globals.SugarLogger.Debugf("getOrders from:%s to:%s", fromDateStr, toDateStr)
pageSize = jxutils.FormalizePageSize(pageSize) pageSize = jxutils.FormalizePageSize(pageSize)
@@ -393,8 +393,15 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku, isInclude
sql += ` sql += `
ORDER BY t1.id` ORDER BY t1.id`
} else { } else {
if isJxFirst {
sql += `
ORDER BY IF(t1.vendor_id = ?, 0, 1), t1.order_created_at DESC`
sqlParams = append(sqlParams, model.VendorIDJX)
} else {
sql += `
ORDER BY t1.order_created_at DESC`
}
sql += ` sql += `
ORDER BY t1.order_created_at DESC
LIMIT ? OFFSET ?` LIMIT ? OFFSET ?`
sqlParams = append(sqlParams, pageSize, offset) sqlParams = append(sqlParams, pageSize, offset)
@@ -415,9 +422,9 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku, isInclude
return orders, totalCount, err return orders, totalCount, err
} }
func (c *OrderManager) GetOrders(ctx *jxcontext.Context, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { func (c *OrderManager) GetOrders(ctx *jxcontext.Context, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst bool, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr) globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr)
orders, totalCount, err := c.getOrders(ctx, false, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, params, offset, pageSize) orders, totalCount, err := c.getOrders(ctx, false, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, isJxFirst, params, offset, pageSize)
if err == nil { if err == nil {
pagedInfo = &model.PagedInfo{ pagedInfo = &model.PagedInfo{
TotalCount: totalCount, TotalCount: totalCount,
@@ -439,7 +446,7 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step { switch step {
case 0: case 0:
orders, _, err = c.getOrders(ctx, true, true, fromDateStr, toDateStr, true, nil, mapParams, 0, -1) orders, _, err = c.getOrders(ctx, true, true, fromDateStr, toDateStr, true, nil, false, mapParams, 0, -1)
case 1: case 1:
afsSkuMap, err = c.getAfsOrderSkuInfo4ExportOrders(ctx, fromDateStr, toDateStr) afsSkuMap, err = c.getAfsOrderSkuInfo4ExportOrders(ctx, fromDateStr, toDateStr)
case 2: case 2:
@@ -687,8 +694,9 @@ func (c *OrderManager) GetOrdersFinancial(ctx *jxcontext.Context, fromDateStr, t
} }
toDate = toDate.Add(24 * time.Hour) toDate = toDate.Add(24 * time.Hour)
// order_finished_at
sqlWhere = ` sqlWhere = `
WHERE t2.order_finished_at >= ? AND t2.order_finished_at < ? WHERE t2.order_created_at >= ? AND t2.order_created_at < ?
` `
sqlParams = []interface{}{ sqlParams = []interface{}{
fromDate, fromDate,

View File

@@ -1,14 +1,34 @@
package defsch package defsch
import ( import (
"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/weixinmsg" "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"
"git.rosy.net.cn/jx-callback/business/msghub" "git.rosy.net.cn/jx-callback/business/msghub"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
)
var (
autoRejectSkuMap = map[int]int{
33996: 1,
33995: 1,
33994: 1,
33991: 1,
}
) )
func (s *DefScheduler) OnAfsOrderNew(order *model.AfsOrder, isPending bool) (err error) { func (s *DefScheduler) OnAfsOrderNew(order *model.AfsOrder, isPending bool) (err error) {
if order.Status == model.AfsOrderStatusWait4Approve { if order.Status == model.AfsOrderStatusWait4Approve {
if !isPending { if !isPending {
if isAutoRejectAfsOrder(order) {
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
if err := handler.AgreeOrRefuseRefund(jxcontext.AdminCtx, order, partner.AfsApproveTypeRefused, "抱歉,蟹券不接受退货或换货"); err != nil {
globals.SugarLogger.Debugf("OnAfsOrderNew, orderID:%s, afsOrderID:%s failed with err:%v", order.VendorOrderID, order.AfsOrderID, err)
}
}
}
msghub.OnNewWait4ApproveAfsOrder(order) msghub.OnNewWait4ApproveAfsOrder(order)
weixinmsg.NotifyAfsOrderStatus(order) weixinmsg.NotifyAfsOrderStatus(order)
} }
@@ -25,3 +45,13 @@ func (s *DefScheduler) OnAfsOrderStatusChanged(order *model.AfsOrder, status *mo
} }
return err return err
} }
func isAutoRejectAfsOrder(order *model.AfsOrder) (isReject bool) {
for _, v := range order.Skus {
if autoRejectSkuMap[jxutils.GetSkuIDFromOrderSkuFinancial(v)] == 1 {
isReject = true
break
}
}
return isReject
}

View File

@@ -74,7 +74,6 @@ func init() {
func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (validVendorIDs []int, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (validVendorIDs []int, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) {
wholeValidVendorMap := make(map[int]int) wholeValidVendorMap := make(map[int]int)
wholeValidVendorMap[model.VendorIDJX] = 1
if len(actStoreSku) > 0 { if len(actStoreSku) > 0 {
storeIDMap := make(map[int]int) storeIDMap := make(map[int]int)
skuIDMap := make(map[int]int) skuIDMap := make(map[int]int)
@@ -715,7 +714,7 @@ func SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, actID int, vendor
task := tasksch.NewParallelTask("SyncAct", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, task := tasksch.NewParallelTask("SyncAct", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorID := batchItemList[0].(int) vendorID := batchItemList[0].(int)
if handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformActHandler); handler != nil { if handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformActHandler); handler != nil {
tmpActMap := &model.ActMap{} tmpActMap := &model.ActMap{}
tmpActMap.ID = actMap[vendorID].MapID tmpActMap.ID = actMap[vendorID].MapID
if err = handler.SyncAct(ctx, nil, actMap[vendorID], nil, actStoreSkuMap[vendorID]); err == nil { if err = handler.SyncAct(ctx, nil, actMap[vendorID], nil, actStoreSkuMap[vendorID]); err == nil {
@@ -725,6 +724,8 @@ func SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, actID int, vendor
} }
// 保存最后一次同步错误信息 // 保存最后一次同步错误信息
dao.UpdateEntity(db, tmpActMap, "Remark") dao.UpdateEntity(db, tmpActMap, "Remark")
} else {
globals.SugarLogger.Warnf("SyncAct strange actID:%d, vendorID:%d", actID, vendorID)
} }
return retVal, err return retVal, err
}, vendorIDs) }, vendorIDs)

View File

@@ -315,3 +315,17 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (err er
func QueryConfigs(key, configType, keyword string) (configList []*model.NewConfig, err error) { func QueryConfigs(key, configType, keyword string) (configList []*model.NewConfig, err error) {
return dao.QueryConfigs(dao.GetDB(), key, configType, keyword) return dao.QueryConfigs(dao.GetDB(), key, configType, keyword)
} }
func GetCityBankBranches(ctx *jxcontext.Context, cityCode int, bankCode string) (info map[int]map[string][]string, err error) {
list, err := dao.GetCityBankBranches(dao.GetDB(), cityCode, bankCode)
if err == nil && len(list) > 0 {
info = make(map[int]map[string][]string)
for _, v := range list {
if info[v.CityCode] == nil {
info[v.CityCode] = make(map[string][]string)
}
info[v.CityCode][v.PayeeBankCode] = append(info[v.CityCode][v.PayeeBankCode], v.PayeeBankBranchName)
}
}
return info, err
}

View File

@@ -42,6 +42,7 @@ type StoreExt struct {
MarketManName string `orm:"size(8)" json:"marketManName"` // 市场负责人姓名 MarketManName string `orm:"size(8)" json:"marketManName"` // 市场负责人姓名
OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名 OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名
OperatorName2 string `orm:"size(8)" json:"operatorName2"` // 非京东运营人姓名
FloatLng float64 `json:"lng"` FloatLng float64 `json:"lng"`
FloatLat float64 `json:"lat"` FloatLat float64 `json:"lat"`
@@ -120,6 +121,7 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte
*/ */
LEFT JOIN user mm ON mm.mobile <> '' AND mm.mobile = t1.market_man_phone AND mm.deleted_at = ? LEFT JOIN user mm ON mm.mobile <> '' AND mm.mobile = t1.market_man_phone AND mm.deleted_at = ?
LEFT JOIN user om ON om.mobile <> '' AND om.mobile = t1.operator_phone AND om.deleted_at = ? LEFT JOIN user om ON om.mobile <> '' AND om.mobile = t1.operator_phone AND om.deleted_at = ?
LEFT JOIN user om2 ON om2.mobile <> '' AND om2.mobile = t1.operator_phone2 AND om2.deleted_at = ?
` `
sqlFromParams = []interface{}{ sqlFromParams = []interface{}{
utils.DefaultTimeValue, utils.DefaultTimeValue,
@@ -128,6 +130,7 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte
// utils.DefaultTimeValue, // utils.DefaultTimeValue,
utils.DefaultTimeValue, utils.DefaultTimeValue,
utils.DefaultTimeValue, utils.DefaultTimeValue,
utils.DefaultTimeValue,
} }
sqlWhere := ` sqlWhere := `
WHERE t1.deleted_at = ? WHERE t1.deleted_at = ?
@@ -174,20 +177,22 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte
} }
if keyword != "" { if keyword != "" {
keywordLike := "%" + keyword + "%" keywordLike := "%" + keyword + "%"
sqlWhere += ` AND (t1.name LIKE ? OR t1.tel1 LIKE ? OR t1.tel2 LIKE ? OR t1.operator_phone LIKE ? OR t1.market_man_phone LIKE ? sqlWhere += ` AND (t1.name LIKE ? OR t1.tel1 LIKE ? OR t1.tel2 LIKE ? OR t1.operator_phone LIKE ? OR t1.operator_phone2 LIKE ? OR t1.market_man_phone LIKE ?
OR t1.last_operator LIKE ? OR city.name LIKE ? OR t1.address LIKE ? OR t1.printer_sn LIKE ? OR t1.licence_code LIKE ? OR t1.id_code LIKE ?` OR t1.last_operator LIKE ? OR city.name LIKE ? OR t1.address LIKE ? OR t1.printer_sn LIKE ? OR t1.licence_code LIKE ? OR t1.id_code LIKE ?`
sqlWhereParams = append(sqlWhereParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) sqlWhereParams = append(sqlWhereParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike,
keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil {
// if !globals.DisableWXAuth1 && jxutils.IsLegalMobileNumber(keywordInt64) { if true { // jxutils.IsLegalMobileNumber(keywordInt64) {
// sql += ` sqlWhere += ` OR (
// LEFT JOIN weixins wx1 ON t1.id = wx1.jxstoreid AND wx1.parentid = -1 AND wx1.tel = ? SELECT COUNT(*)
// LEFT JOIN weixins wx2 ON t1.id = wx2.jxstoreid AND wx2.parentid = -1 FROM casbin_rule t11
// LEFT JOIN weixins wx3 ON wx3.parentid = wx2.id AND wx3.tel = ? JOIN user t12 ON t12.user_id = t11.v0 AND t12.mobile LIKE ?
// ` WHERE t11.v1 <> '' AND (t11.v1 = CONCAT(?, t1.id) OR t11.v1 = CONCAT(?, t1.market_man_role) OR t11.v1 = CONCAT(?, t1.operator_role) OR t11.v1 = CONCAT(?, t1.operator_role2))
// sqlParams = append(sqlParams, keywordInt64, keywordInt64) ) > 0`
// sqlWhere += " OR wx1.id IS NOT NULL OR wx3.id IS NOT NULL" prefix := autils.NewRole("", 0).GetFullName()
// } sqlWhereParams = append(sqlWhereParams, keyword+"%", autils.NewStoreBossRole(-1).GetFullName(), prefix, prefix, prefix) // 必须要前缀,不然不能用过些会很慢
}
sqlWhere += " OR t1.id = ? OR t1.city_code = ? OR t1.district_code = ?" sqlWhere += " OR t1.id = ? OR t1.city_code = ? OR t1.district_code = ?"
sqlWhereParams = append(sqlWhereParams, keywordInt64, keywordInt64, keywordInt64) sqlWhereParams = append(sqlWhereParams, keywordInt64, keywordInt64, keywordInt64)
if jxutils.GuessVendorIDFromVendorStoreID(keywordInt64) != model.VendorIDUnknown { if jxutils.GuessVendorIDFromVendorStoreID(keywordInt64) != model.VendorIDUnknown {
@@ -195,7 +200,7 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte
OR (SELECT COUNT(*) FROM store_map tsm WHERE t1.id = tsm.store_id AND tsm.deleted_at = ? AND tsm.vendor_store_id = ?) > 0 OR (SELECT COUNT(*) FROM store_map tsm WHERE t1.id = tsm.store_id AND tsm.deleted_at = ? AND tsm.vendor_store_id = ?) > 0
OR (SELECT COUNT(*) FROM store_courier_map tsm WHERE t1.id = tsm.store_id AND tsm.deleted_at = ? AND tsm.vendor_store_id = ?) > 0 OR (SELECT COUNT(*) FROM store_courier_map tsm WHERE t1.id = tsm.store_id AND tsm.deleted_at = ? AND tsm.vendor_store_id = ?) > 0
` `
sqlWhereParams = append(sqlWhereParams, utils.DefaultTimeValue, keywordInt64, utils.DefaultTimeValue, keywordInt64) sqlWhereParams = append(sqlWhereParams, utils.DefaultTimeValue, keyword, utils.DefaultTimeValue, keyword)
} }
} }
sqlWhere += ")" sqlWhere += ")"
@@ -308,6 +313,7 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa
IF(mm.name <> '', mm.name, mm.user_id2) market_man_name, IF(mm.name <> '', mm.name, mm.user_id2) market_man_name,
bank.value payee_bank_name, bank.value payee_bank_name,
IF(om.name <> '', om.name, om.user_id2) operator_name, IF(om.name <> '', om.name, om.user_id2) operator_name,
IF(om2.name <> '', om2.name, om2.user_id2) operator_name2,
province.code province_code, province.code province_code,
province.name province_name, province.name province_name,
city.name city_name, city.name city_name,
@@ -323,6 +329,9 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa
offset = jxutils.FormalizePageOffset(offset) offset = jxutils.FormalizePageOffset(offset)
pageSize = jxutils.FormalizePageSize(pageSize) pageSize = jxutils.FormalizePageSize(pageSize)
mapLimit := false mapLimit := false
// globals.SugarLogger.Debug(sql)
// globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false))
if err = dao.GetRows(db, &storeList, sql, sqlParams...); err == nil { if err = dao.GetRows(db, &storeList, sql, sqlParams...); err == nil {
// 地图区域限制过滤 // 地图区域限制过滤
if mapLongitude2, ok := params["mapLongitude"].(string); ok { if mapLongitude2, ok := params["mapLongitude"].(string); ok {
@@ -1546,7 +1555,7 @@ func getAllUsers4Store(ctx *jxcontext.Context, db *dao.DaoDB, store *model.Store
} }
// 直接电话信息相关人员 // 直接电话信息相关人员
for _, mobile := range []string{store.Tel1, store.Tel2, store.MarketManPhone, store.OperatorPhone} { for _, mobile := range []string{store.Tel1, store.Tel2, store.MarketManPhone, store.OperatorPhone, store.OperatorPhone2} {
if mobile != "" { if mobile != "" {
if user, err2 := dao.GetUserByID(db, "mobile", mobile); err2 == nil { if user, err2 := dao.GetUserByID(db, "mobile", mobile); err2 == nil {
if userMap[user.GetID()] == 0 { if userMap[user.GetID()] == 0 {

View File

@@ -1145,6 +1145,8 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind
skuBind.Status = model.StoreSkuBindStatusNormal skuBind.Status = model.StoreSkuBindStatusNormal
} }
kvs := map[string]interface{}{ kvs := map[string]interface{}{
model.FieldLastOperator: ctx.GetUserName(),
model.FieldUpdatedAt: time.Now(),
model.FieldStatus: skuBind.Status, model.FieldStatus: skuBind.Status,
model.FieldJdSyncStatus: skuBind.JdSyncStatus | model.SyncFlagSaleMask, model.FieldJdSyncStatus: skuBind.JdSyncStatus | model.SyncFlagSaleMask,
model.FieldEbaiSyncStatus: skuBind.EbaiSyncStatus | model.SyncFlagSaleMask, model.FieldEbaiSyncStatus: skuBind.EbaiSyncStatus | model.SyncFlagSaleMask,

View File

@@ -112,7 +112,11 @@ func Init() {
}, autoSaleStoreSkuTimeList) }, autoSaleStoreSkuTimeList)
if beego.BConfig.RunMode == "beta" { if beego.BConfig.RunMode == "beta" {
netspider.GetAndStoreCitiesShops(jxcontext.AdminCtx, nil, nil, 0, 0, false, true) ScheduleTimerFunc("GetAndStoreCitiesShops", func() {
netspider.GetAndStoreCitiesShops(jxcontext.AdminCtx, nil, nil, 0, 0, false, false)
}, []string{
"04:05:06",
})
} }
} }

View File

@@ -1,9 +1,12 @@
package datares package datares
import ( import (
"bytes"
"fmt" "fmt"
"image"
"image/jpeg"
"image/png"
"net/http" "net/http"
"strings"
"git.rosy.net.cn/jx-callback/business/jxutils" "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/jxcontext"
@@ -18,6 +21,9 @@ import (
const ( const (
qiniuTokenExpires = 300 // 七牛TOKEN有效时间5分钟 qiniuTokenExpires = 300 // 七牛TOKEN有效时间5分钟
MainImgWidth = 800
MainImgHeight = 800
) )
type UploadResTokenInfo struct { type UploadResTokenInfo struct {
@@ -28,6 +34,19 @@ type UploadResTokenInfo struct {
Img string `json:"img,omitempty"` Img string `json:"img,omitempty"`
} }
func Binary2Image(binaryData []byte, mimeType string) (img image.Image, outMimeType string, err error) {
if mimeType == "" {
mimeType = http.DetectContentType(binaryData)
}
switch mimeType {
case model.MimeTypeJpeg:
img, err = jpeg.Decode(bytes.NewReader(binaryData))
case model.MimeTypePng:
img, err = png.Decode(bytes.NewReader(binaryData))
}
return img, mimeType, err
}
func GetQiniuUploadToken(ctx *jxcontext.Context, suffix, hashCode string) (upTokenInfo *UploadResTokenInfo, err error) { func GetQiniuUploadToken(ctx *jxcontext.Context, suffix, hashCode string) (upTokenInfo *UploadResTokenInfo, err error) {
imgURL := "" imgURL := ""
if hashCode != "" { if hashCode != "" {
@@ -48,32 +67,20 @@ func GetQiniuUploadToken(ctx *jxcontext.Context, suffix, hashCode string) (upTok
return upTokenInfo, err return upTokenInfo, err
} }
func suffix2MimeType(suffix string) (mimeType string) {
suffix = strings.Trim(suffix, ". ")
for k, v := range model.ValidMimeTypes {
for _, v2 := range v {
if v2 == suffix {
mimeType = k
break
}
}
}
return mimeType
}
func getMimeTypeFromURL(resourceURL string) (mimeType string) {
index := strings.LastIndex(resourceURL, ".")
if index >= 0 {
mimeType = suffix2MimeType(resourceURL[index:])
}
return mimeType
}
// 此函数要求resBinary不能空mimeType与hashCode必须是正确的 // 此函数要求resBinary不能空mimeType与hashCode必须是正确的
func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, hashCode string, resBinary []byte, imgType int, isAsyncUpload2Vendor bool) (dataRes *model.DataResource, err error) { func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, hashCode string, resBinary []byte, imgType int, isAsyncUpload2Vendor bool) (dataRes *model.DataResource, err error) {
globals.SugarLogger.Debugf("RegisterDataResource, name:%s, resourceURL:%s, mimeType:%s, hashCode:%s, imgType:%d, isAsyncUpload2Vendor;%t", name, resourceURL, mimeType, hashCode, imgType, isAsyncUpload2Vendor) globals.SugarLogger.Debugf("RegisterDataResource, name:%s, resourceURL:%s, mimeType:%s, hashCode:%s, imgType:%d, isAsyncUpload2Vendor;%t", name, resourceURL, mimeType, hashCode, imgType, isAsyncUpload2Vendor)
if model.ValidMimeTypes[mimeType] == nil { if model.ValidMimeTypes[mimeType] == 0 {
return nil, fmt.Errorf("MIME type:%s非法", mimeType) return nil, fmt.Errorf("MIME type:%s非法,当前只支持:%s", mimeType, model.GetValidMimeTypeDesc())
}
img, _, err := Binary2Image(resBinary, mimeType)
if err != nil {
return nil, err
}
if imgType == model.ImgTypeMain {
if img.Bounds().Dx() != MainImgWidth || img.Bounds().Dy() != MainImgHeight {
return nil, fmt.Errorf("图片大小:%dx%d非法要求必须:%dx%d", img.Bounds().Dx(), img.Bounds().Dy(), MainImgWidth, MainImgHeight)
}
} }
dataRes = &model.DataResource{ dataRes = &model.DataResource{
Name: name, Name: name,

View File

@@ -575,7 +575,7 @@ func NotifyAfsOrderStatus(afsOrder *model.AfsOrder) (err error) {
"color": WX_HIGHLEVEL_TEMPLATE_COLOR, "color": WX_HIGHLEVEL_TEMPLATE_COLOR,
}, },
"keyword3": map[string]interface{}{ "keyword3": map[string]interface{}{
"value": utils.Time2Str(afsOrder.CreatedAt), "value": utils.Time2Str(afsOrder.AfsCreatedAt),
"color": venderColors[order.VendorID], "color": venderColors[order.VendorID],
}, },
"remark": map[string]interface{}{ "remark": map[string]interface{}{

View File

@@ -3,8 +3,8 @@ package model
type CasbinRule struct { type CasbinRule struct {
ID int `orm:"column(id)" json:"id"` ID int `orm:"column(id)" json:"id"`
PType string PType string
V0 string V0 string `orm:"index"`
V1 string V1 string `orm:"index"`
V2 string V2 string
V3 string V3 string
V4 string V4 string

View File

@@ -1,19 +1,20 @@
package model package model
import "strings"
const ( const (
ImgTypeLocal = 0 // 京西自己用的,不需要上传至平台 ImgTypeLocal = 0 // 京西自己用的,不需要上传至平台
ImgTypeMain = 1 // 商品主图 ImgTypeMain = 1 // 商品主图
ImgTypeDesc = 2 // 商品描述详情 ImgTypeDesc = 2 // 商品描述详情
MimeTypeJpeg = "image/jpeg"
MimeTypePng = "image/png"
) )
var ( var (
ValidMimeTypes = map[string][]string{ ValidMimeTypes = map[string]int{
"image/jpeg": []string{"jpeg", "jpg"}, MimeTypeJpeg: 1,
"image/png": []string{"png"}, MimeTypePng: 1,
// "image/gif": []string{"gif"}, // 美团不支持GIF
"video/mpeg": []string{"mpeg", "mpg"},
"video/mp4": []string{"mp4", "m4v"},
} }
) )
@@ -33,3 +34,11 @@ type DataResource struct {
Remark string `orm:"size(1024)" json:"remark"` Remark string `orm:"size(1024)" json:"remark"`
} }
func GetValidMimeTypeDesc() (desc string) {
strList := []string{}
for k := range ValidMimeTypes {
strList = append(strList, k)
}
return strings.Join(strList, ",")
}

View File

@@ -150,13 +150,14 @@ func GetStoresOrderSaleInfo(db *DaoDB, storeIDList []int, fromTime time.Time, to
} }
// 用int64类型去取float型的数据库返回值会取不到 // 用int64类型去取float型的数据库返回值会取不到
// order_finished_at
sql := fmt.Sprintf(` sql := fmt.Sprintf(`
SELECT IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) store_id, t1.vendor_id, IF(t1.status < ?, 0, t1.status) status, SELECT IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) store_id, t1.vendor_id, IF(t1.status < ?, 0, t1.status) status,
COUNT(*) count, SUM(t1.shop_price) shop_price, SUM(t1.vendor_price) vendor_price, SUM(t1.sale_price) sale_price, SUM(t1.actual_pay_price) actual_pay_price, COUNT(*) count, SUM(t1.shop_price) shop_price, SUM(t1.vendor_price) vendor_price, SUM(t1.sale_price) sale_price, SUM(t1.actual_pay_price) actual_pay_price,
CAST(SUM(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100)) AS SIGNED) earning_price CAST(SUM(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100)) AS SIGNED) earning_price
FROM goods_order t1 FROM goods_order t1
LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id)
WHERE t1.order_finished_at >= ? AND t1.order_finished_at <= ? WHERE t1.order_created_at >= ? AND t1.order_created_at <= ?
`, model.DefaultEarningPricePercentage) `, model.DefaultEarningPricePercentage)
sqlParams := []interface{}{ sqlParams := []interface{}{
model.OrderStatusEndBegin, model.OrderStatusEndBegin,
@@ -228,6 +229,7 @@ func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID in
} }
func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int) (skuList []*OrderSkuWithActualPayPrice, err error) { func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int) (skuList []*OrderSkuWithActualPayPrice, err error) {
// order_finished_at
sql := ` sql := `
SELECT t1.*, SELECT t1.*,
t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id,
@@ -235,12 +237,15 @@ func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAt
FROM order_sku t1 FROM order_sku t1
JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id)
WHERE IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (` + GenQuestionMarks(len(storeIDs)) + `) AND t2.order_finished_at >= ? AND t2.order_finished_at <= ?` WHERE t2.order_created_at >= ? AND t2.order_created_at <= ?`
sqlParams := []interface{}{ sqlParams := []interface{}{
storeIDs,
finishedAtBegin, finishedAtBegin,
finishedAtEnd, finishedAtEnd,
} }
if len(storeIDs) > 0 {
sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(statusList) > 0 { if len(statusList) > 0 {
sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")" sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")"
sqlParams = append(sqlParams, statusList) sqlParams = append(sqlParams, statusList)
@@ -276,13 +281,15 @@ func GetStoreAfsOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishe
SELECT t1.* SELECT t1.*
FROM order_sku_financial t1 FROM order_sku_financial t1
JOIN afs_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id JOIN afs_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
WHERE t1.is_afs_order = 1 WHERE t1.is_afs_order = 1 AND t2.afs_finished_at >= ? AND t2.afs_finished_at <= ?`
AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (` + GenQuestionMarks(len(storeIDs)) + `) AND t2.afs_finished_at >= ? AND t2.afs_finished_at <= ?`
sqlParams := []interface{}{ sqlParams := []interface{}{
storeIDs,
finishedAtBegin, finishedAtBegin,
finishedAtEnd, finishedAtEnd,
} }
if len(storeIDs) > 0 {
sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(statusList) > 0 { if len(statusList) > 0 {
sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")" sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")"
sqlParams = append(sqlParams, statusList) sqlParams = append(sqlParams, statusList)

View File

@@ -99,7 +99,7 @@ func GetStoreListByMobile(db *DaoDB, mobile string) (storeList []*StoreWithCityN
FROM ( FROM (
SELECT * SELECT *
FROM store t1 FROM store t1
WHERE (t1.market_man_phone = ? OR t1.operator_phone = ?) WHERE (t1.market_man_phone = ? OR t1.operator_phone = ? OR t1.operator_phone2 = ?)
UNION DISTINCT UNION DISTINCT
SELECT t1.* SELECT t1.*
FROM store t1 FROM store t1
@@ -111,6 +111,7 @@ func GetStoreListByMobile(db *DaoDB, mobile string) (storeList []*StoreWithCityN
WHERE t1.deleted_at = ? WHERE t1.deleted_at = ?
ORDER BY t1.name` ORDER BY t1.name`
sqlParams := []interface{}{ sqlParams := []interface{}{
mobile,
mobile, mobile,
mobile, mobile,
mobile, mobile,
@@ -132,8 +133,8 @@ func GetStoreListByMobileOrStoreIDs(db *DaoDB, mobile string, shortRoleNameList
utils.DefaultTimeValue, utils.DefaultTimeValue,
} }
if mobile != "" { if mobile != "" {
sql += " OR t1.market_man_phone = ? OR t1.operator_phone = ?" sql += " OR t1.market_man_phone = ? OR t1.operator_phone = ? OR t1.operator_phone2 = ?"
sqlParams = append(sqlParams, mobile, mobile) sqlParams = append(sqlParams, mobile, mobile, mobile)
} }
if len(shortRoleNameList) > 0 { if len(shortRoleNameList) > 0 {
questionMarks := GenQuestionMarks(len(shortRoleNameList)) questionMarks := GenQuestionMarks(len(shortRoleNameList))

View File

@@ -47,6 +47,12 @@ type StoreDetail2 struct {
CityName string `json:"cityName"` CityName string `json:"cityName"`
} }
type CityBrankBranch struct {
CityCode int
PayeeBankBranchName string `orm:"size(255)" json:"payeeBankBranchName"` // 开户支行
PayeeBankCode string `orm:"size(8)" json:"payeeBankCode"` // 开户行代码
}
func (s *StoreDetail) GetPricePerentage(price int) (pricePercentage int) { func (s *StoreDetail) GetPricePerentage(price int) (pricePercentage int) {
return pricePercentage return pricePercentage
} }
@@ -484,3 +490,26 @@ func GetStoreList(db *DaoDB, idList []int, mobileList []string, shortRoleName st
err = GetRows(db, &storeList, sql, sqlParams...) err = GetRows(db, &storeList, sql, sqlParams...)
return storeList, err return storeList, err
} }
func GetCityBankBranches(db *DaoDB, cityCode int, bankCode string) (list []*CityBrankBranch, err error) {
sql := `
SELECT payee_bank_code, city_code, payee_bank_branch_name
FROM store
WHERE payee_bank_branch_name <> ''`
sqlParams := []interface{}{}
if cityCode > 0 {
sql += " AND city_code = ?"
sqlParams = append(sqlParams, cityCode)
} else {
sql += " AND city_code <> 0"
}
if bankCode != "" {
sql += " AND payee_bank_code = ?"
sqlParams = append(sqlParams, bankCode)
} else {
sql += " AND payee_bank_code <> ''"
}
sql += " GROUP BY 1,2,3;"
err = GetRows(db, &list, sql, sqlParams...)
return list, err
}

View File

@@ -301,7 +301,9 @@ type Store struct {
// OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名 // OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名
OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 运营人电话 OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 运营人电话
OperatorRole string `orm:"size(32)" json:"operatorRole"` // 京东运营人组(角色) OperatorRole string `orm:"size(32)" json:"operatorRole"` // 京东运营人组(角色)
OperatorRole2 string `orm:"size(32)" json:"operatorRole2"` // 非京东运营人组(角色)
OperatorPhone2 string `orm:"size(16)" json:"operatorPhone2"` // 非京东运营人电话
OperatorRole2 string `orm:"size(32)" json:"operatorRole2"` // 非京东运营人组(角色)
} }
func (*Store) TableUnique() [][]string { func (*Store) TableUnique() [][]string {

View File

@@ -315,3 +315,18 @@ func (c *CmsController) CreateQrOrBarCode() {
return retVal, "", err return retVal, "", err
}) })
} }
// @Title 查询当前系统中已有的城市中的银行支行
// @Description 查询当前系统中已有的城市中的银行支行
// @Param token header string true "认证token"
// @Param cityCode query int false "城市代码"
// @Param bankCode query string false "银行代码"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetCityBankBranches [get]
func (c *CmsController) GetCityBankBranches() {
c.callGetCityBankBranches(func(params *tCmsGetCityBankBranchesParams) (retVal interface{}, errCode string, err error) {
retVal, err = cms.GetCityBankBranches(params.Ctx, params.CityCode, params.BankCode)
return retVal, "", err
})
}

View File

@@ -276,6 +276,7 @@ func (c *OrderController) ExportMTWaybills() {
// @Param cities query string false "城市code列表[1,2,3],缺省不限制" // @Param cities query string false "城市code列表[1,2,3],缺省不限制"
// @Param isIncludeFake query bool false "是否包括假订单" // @Param isIncludeFake query bool false "是否包括假订单"
// @Param skuIDs query string false "包含的skuID列表或的关系" // @Param skuIDs query string false "包含的skuID列表或的关系"
// @Param isJxFirst query bool false "排序是否京西订单优先(缺省为否)"
// @Param offset query int false "结果起始序号以0开始缺省为0" // @Param offset query int false "结果起始序号以0开始缺省为0"
// @Param pageSize query int false "结果页大小缺省为50-1表示全部" // @Param pageSize query int false "结果页大小缺省为50-1表示全部"
// @Success 200 {object} controllers.CallResult // @Success 200 {object} controllers.CallResult
@@ -285,7 +286,7 @@ func (c *OrderController) GetOrders() {
c.callGetOrders(func(params *tOrderGetOrdersParams) (retVal interface{}, errCode string, err error) { c.callGetOrders(func(params *tOrderGetOrdersParams) (retVal interface{}, errCode string, err error) {
var skuIDs []int var skuIDs []int
if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs); err == nil { if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs); err == nil {
retVal, err = orderman.FixedOrderManager.GetOrders(params.Ctx, params.IsIncludeFake, params.FromDate, params.ToDate, params.IsDateFinish, skuIDs, params.MapData, params.Offset, params.PageSize) retVal, err = orderman.FixedOrderManager.GetOrders(params.Ctx, params.IsIncludeFake, params.FromDate, params.ToDate, params.IsDateFinish, skuIDs, params.IsJxFirst, params.MapData, params.Offset, params.PageSize)
} }
return retVal, "", err return retVal, "", err
}) })
@@ -519,7 +520,8 @@ func skuList2Map(skuList []*model.OrderSku) (skuCount int, skuMap map[int64]*mod
if sku.SkuID > 0 { if sku.SkuID > 0 {
index := jxutils.Combine2Int(skuID, sku.StoreSubID) index := jxutils.Combine2Int(skuID, sku.StoreSubID)
if skuMap[index] == nil { if skuMap[index] == nil {
skuMap[index] = sku tmpSku := *sku
skuMap[index] = &tmpSku
} else { } else {
skuMap[index].Count += sku.Count skuMap[index].Count += sku.Count
} }

View File

@@ -214,6 +214,15 @@ func init() {
Filters: nil, Filters: nil,
Params: nil}) Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"],
beego.ControllerComments{
Method: "GetCityBankBranches",
Router: `/GetCityBankBranches`,
AllowHTTPMethods: []string{"get"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"], beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "GetConfig", Method: "GetConfig",