diff --git a/business/authz/authz.go b/business/authz/authz.go index 247b3e4cb..b6ec6406a 100644 --- a/business/authz/authz.go +++ b/business/authz/authz.go @@ -47,6 +47,8 @@ func (r *RoleInfo) GetFullName() (fullRoleName string) { } if r.StoreID > 0 { strList = append(strList, StoreRolePrefix, utils.Int2Str(r.StoreID)) + } else if r.StoreID != 0 { + strList = append(strList, StoreRolePrefix, "") } fullRoleName = strings.Join(strList, RoleNameSep) return fullRoleName diff --git a/business/jxcallback/orderman/order_afs.go b/business/jxcallback/orderman/order_afs.go index cb985d2e8..942271fb2 100644 --- a/business/jxcallback/orderman/order_afs.go +++ b/business/jxcallback/orderman/order_afs.go @@ -72,11 +72,13 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode } } if existAfsOrder != nil { + // todo 可能导致状态回绕 existAfsOrder.Status = afsOrder.Status existAfsOrder.VendorStatus = afsOrder.VendorStatus if _, err = dao.UpdateEntity(db, existAfsOrder, "Status", "VendorStatus"); err != nil { return err } + afsOrder = existAfsOrder } else { // 全退都要先全删除再建 if afsOrder.RefundType == model.AfsTypeFullRefund { diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 657f0c807..e4657da84 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -228,7 +228,7 @@ func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toD 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) pageSize = jxutils.FormalizePageSize(pageSize) @@ -393,8 +393,15 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku, isInclude sql += ` ORDER BY t1.id` } 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 += ` - ORDER BY t1.order_created_at DESC LIMIT ? OFFSET ?` sqlParams = append(sqlParams, pageSize, offset) @@ -415,9 +422,9 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku, isInclude 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) - 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 { pagedInfo = &model.PagedInfo{ 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) { switch step { 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: afsSkuMap, err = c.getAfsOrderSkuInfo4ExportOrders(ctx, fromDateStr, toDateStr) case 2: @@ -687,8 +694,9 @@ func (c *OrderManager) GetOrdersFinancial(ctx *jxcontext.Context, fromDateStr, t } toDate = toDate.Add(24 * time.Hour) + // order_finished_at sqlWhere = ` - WHERE t2.order_finished_at >= ? AND t2.order_finished_at < ? + WHERE t2.order_created_at >= ? AND t2.order_created_at < ? ` sqlParams = []interface{}{ fromDate, diff --git a/business/jxcallback/scheduler/defsch/defsch_afs.go b/business/jxcallback/scheduler/defsch/defsch_afs.go index 7e3044ca2..f8a00c562 100644 --- a/business/jxcallback/scheduler/defsch/defsch_afs.go +++ b/business/jxcallback/scheduler/defsch/defsch_afs.go @@ -1,14 +1,34 @@ package defsch 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/model" "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) { if order.Status == model.AfsOrderStatusWait4Approve { 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) weixinmsg.NotifyAfsOrderStatus(order) } @@ -25,3 +45,13 @@ func (s *DefScheduler) OnAfsOrderStatusChanged(order *model.AfsOrder, status *mo } 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 +} diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index c0aa517e0..8fb0b81c9 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -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) { wholeValidVendorMap := make(map[int]int) - wholeValidVendorMap[model.VendorIDJX] = 1 if len(actStoreSku) > 0 { storeIDMap := 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, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { 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.ID = actMap[vendorID].MapID 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") + } else { + globals.SugarLogger.Warnf("SyncAct strange actID:%d, vendorID:%d", actID, vendorID) } return retVal, err }, vendorIDs) diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index e9669e1a7..7ee2f8b3a 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -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) { 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 +} diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 0a63ad7ff..987404971 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -42,6 +42,7 @@ type StoreExt struct { MarketManName string `orm:"size(8)" json:"marketManName"` // 市场负责人姓名 OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名 + OperatorName2 string `orm:"size(8)" json:"operatorName2"` // 非京东运营人姓名 FloatLng float64 `json:"lng"` 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 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{}{ 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, } sqlWhere := ` WHERE t1.deleted_at = ? @@ -174,20 +177,22 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte } if 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 ?` - 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 !globals.DisableWXAuth1 && jxutils.IsLegalMobileNumber(keywordInt64) { - // sql += ` - // LEFT JOIN weixins wx1 ON t1.id = wx1.jxstoreid AND wx1.parentid = -1 AND wx1.tel = ? - // LEFT JOIN weixins wx2 ON t1.id = wx2.jxstoreid AND wx2.parentid = -1 - // LEFT JOIN weixins wx3 ON wx3.parentid = wx2.id AND wx3.tel = ? - // ` - // sqlParams = append(sqlParams, keywordInt64, keywordInt64) - // sqlWhere += " OR wx1.id IS NOT NULL OR wx3.id IS NOT NULL" - // } + if true { // jxutils.IsLegalMobileNumber(keywordInt64) { + sqlWhere += ` OR ( + SELECT COUNT(*) + FROM casbin_rule t11 + 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)) + ) > 0` + 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 = ?" sqlWhereParams = append(sqlWhereParams, keywordInt64, keywordInt64, keywordInt64) 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_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 += ")" @@ -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, bank.value payee_bank_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.name province_name, city.name city_name, @@ -323,6 +329,9 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa offset = jxutils.FormalizePageOffset(offset) pageSize = jxutils.FormalizePageSize(pageSize) mapLimit := false + // globals.SugarLogger.Debug(sql) + // globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false)) + if err = dao.GetRows(db, &storeList, sql, sqlParams...); err == nil { // 地图区域限制过滤 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 user, err2 := dao.GetUserByID(db, "mobile", mobile); err2 == nil { if userMap[user.GetID()] == 0 { diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 40bf983fe..06c099032 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -1145,6 +1145,8 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind skuBind.Status = model.StoreSkuBindStatusNormal } kvs := map[string]interface{}{ + model.FieldLastOperator: ctx.GetUserName(), + model.FieldUpdatedAt: time.Now(), model.FieldStatus: skuBind.Status, model.FieldJdSyncStatus: skuBind.JdSyncStatus | model.SyncFlagSaleMask, model.FieldEbaiSyncStatus: skuBind.EbaiSyncStatus | model.SyncFlagSaleMask, diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 2a2dc9a0a..0c73806cd 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -112,7 +112,11 @@ func Init() { }, autoSaleStoreSkuTimeList) 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", + }) } } diff --git a/business/jxutils/datares/datares.go b/business/jxutils/datares/datares.go index e1c36bfd5..7949b79cf 100644 --- a/business/jxutils/datares/datares.go +++ b/business/jxutils/datares/datares.go @@ -1,9 +1,12 @@ package datares import ( + "bytes" "fmt" + "image" + "image/jpeg" + "image/png" "net/http" - "strings" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -18,6 +21,9 @@ import ( const ( qiniuTokenExpires = 300 // 七牛TOKEN有效时间,5分钟 + + MainImgWidth = 800 + MainImgHeight = 800 ) type UploadResTokenInfo struct { @@ -28,6 +34,19 @@ type UploadResTokenInfo struct { 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) { imgURL := "" if hashCode != "" { @@ -48,32 +67,20 @@ func GetQiniuUploadToken(ctx *jxcontext.Context, suffix, hashCode string) (upTok 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必须是正确的 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) - if model.ValidMimeTypes[mimeType] == nil { - return nil, fmt.Errorf("MIME type:%s非法", mimeType) + if model.ValidMimeTypes[mimeType] == 0 { + 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{ Name: name, diff --git a/business/jxutils/weixinmsg/weixinmsg.go b/business/jxutils/weixinmsg/weixinmsg.go index 80f97c637..f6dfcc353 100644 --- a/business/jxutils/weixinmsg/weixinmsg.go +++ b/business/jxutils/weixinmsg/weixinmsg.go @@ -575,7 +575,7 @@ func NotifyAfsOrderStatus(afsOrder *model.AfsOrder) (err error) { "color": WX_HIGHLEVEL_TEMPLATE_COLOR, }, "keyword3": map[string]interface{}{ - "value": utils.Time2Str(afsOrder.CreatedAt), + "value": utils.Time2Str(afsOrder.AfsCreatedAt), "color": venderColors[order.VendorID], }, "remark": map[string]interface{}{ diff --git a/business/model/casbin_rule.go b/business/model/casbin_rule.go index b0913f95a..2dcdffcaf 100644 --- a/business/model/casbin_rule.go +++ b/business/model/casbin_rule.go @@ -3,8 +3,8 @@ package model type CasbinRule struct { ID int `orm:"column(id)" json:"id"` PType string - V0 string - V1 string + V0 string `orm:"index"` + V1 string `orm:"index"` V2 string V3 string V4 string diff --git a/business/model/common.go b/business/model/common.go index 661f24350..c539770f3 100644 --- a/business/model/common.go +++ b/business/model/common.go @@ -1,19 +1,20 @@ package model +import "strings" + const ( ImgTypeLocal = 0 // 京西自己用的,不需要上传至平台 ImgTypeMain = 1 // 商品主图 ImgTypeDesc = 2 // 商品描述详情 + + MimeTypeJpeg = "image/jpeg" + MimeTypePng = "image/png" ) var ( - ValidMimeTypes = map[string][]string{ - "image/jpeg": []string{"jpeg", "jpg"}, - "image/png": []string{"png"}, - // "image/gif": []string{"gif"}, // 美团不支持GIF - - "video/mpeg": []string{"mpeg", "mpg"}, - "video/mp4": []string{"mp4", "m4v"}, + ValidMimeTypes = map[string]int{ + MimeTypeJpeg: 1, + MimeTypePng: 1, } ) @@ -33,3 +34,11 @@ type DataResource struct { 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, ",") +} diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index d974f86dd..a8b22cdbb 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -150,13 +150,14 @@ func GetStoresOrderSaleInfo(db *DaoDB, storeIDList []int, fromTime time.Time, to } // 用int64类型去取float型的数据库返回值,会取不到 + // order_finished_at 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, 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 FROM goods_order t1 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) sqlParams := []interface{}{ 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) { + // order_finished_at sql := ` SELECT t1.*, 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 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) - 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{}{ - storeIDs, finishedAtBegin, 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 { sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")" sqlParams = append(sqlParams, statusList) @@ -276,13 +281,15 @@ func GetStoreAfsOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishe SELECT 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 - WHERE t1.is_afs_order = 1 - 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 <= ?` + WHERE t1.is_afs_order = 1 AND t2.afs_finished_at >= ? AND t2.afs_finished_at <= ?` sqlParams := []interface{}{ - storeIDs, finishedAtBegin, 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 { sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")" sqlParams = append(sqlParams, statusList) diff --git a/business/model/dao/dao_user2.go b/business/model/dao/dao_user2.go index a015ec9cb..009ab8f40 100644 --- a/business/model/dao/dao_user2.go +++ b/business/model/dao/dao_user2.go @@ -99,7 +99,7 @@ func GetStoreListByMobile(db *DaoDB, mobile string) (storeList []*StoreWithCityN FROM ( SELECT * 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 SELECT t1.* FROM store t1 @@ -111,6 +111,7 @@ func GetStoreListByMobile(db *DaoDB, mobile string) (storeList []*StoreWithCityN WHERE t1.deleted_at = ? ORDER BY t1.name` sqlParams := []interface{}{ + mobile, mobile, mobile, mobile, @@ -132,8 +133,8 @@ func GetStoreListByMobileOrStoreIDs(db *DaoDB, mobile string, shortRoleNameList utils.DefaultTimeValue, } if mobile != "" { - sql += " OR t1.market_man_phone = ? OR t1.operator_phone = ?" - sqlParams = append(sqlParams, mobile, mobile) + sql += " OR t1.market_man_phone = ? OR t1.operator_phone = ? OR t1.operator_phone2 = ?" + sqlParams = append(sqlParams, mobile, mobile, mobile) } if len(shortRoleNameList) > 0 { questionMarks := GenQuestionMarks(len(shortRoleNameList)) diff --git a/business/model/dao/store.go b/business/model/dao/store.go index aae783c26..1a06e7807 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -47,6 +47,12 @@ type StoreDetail2 struct { 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) { return pricePercentage } @@ -484,3 +490,26 @@ func GetStoreList(db *DaoDB, idList []int, mobileList []string, shortRoleName st err = GetRows(db, &storeList, sql, sqlParams...) 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 +} diff --git a/business/model/store.go b/business/model/store.go index 2fb4c0819..d6dfce14b 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -301,7 +301,9 @@ type Store struct { // OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名 OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 运营人电话 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 { diff --git a/controllers/cms.go b/controllers/cms.go index 3c42dbfa7..e6d47e614 100644 --- a/controllers/cms.go +++ b/controllers/cms.go @@ -315,3 +315,18 @@ func (c *CmsController) CreateQrOrBarCode() { 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 + }) +} diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 898afdda1..b2612224b 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -276,6 +276,7 @@ func (c *OrderController) ExportMTWaybills() { // @Param cities query string false "城市code列表[1,2,3],缺省不限制" // @Param isIncludeFake query bool false "是否包括假订单" // @Param skuIDs query string false "包含的skuID列表,或的关系" +// @Param isJxFirst query bool false "排序是否京西订单优先(缺省为否)" // @Param offset query int false "结果起始序号(以0开始,缺省为0)" // @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult @@ -285,7 +286,7 @@ func (c *OrderController) GetOrders() { c.callGetOrders(func(params *tOrderGetOrdersParams) (retVal interface{}, errCode string, err error) { var skuIDs []int 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 }) @@ -519,7 +520,8 @@ func skuList2Map(skuList []*model.OrderSku) (skuCount int, skuMap map[int64]*mod if sku.SkuID > 0 { index := jxutils.Combine2Int(skuID, sku.StoreSubID) if skuMap[index] == nil { - skuMap[index] = sku + tmpSku := *sku + skuMap[index] = &tmpSku } else { skuMap[index].Count += sku.Count } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 3b125721f..3a7ba9778 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -214,6 +214,15 @@ func init() { 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.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.ControllerComments{ Method: "GetConfig",