Merge branch 'mark' of e.coding.net:rosydev/jx-callback into mark
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
|
|
||||||
@@ -2179,6 +2180,8 @@ func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io.
|
|||||||
storeSkuNamePriceListUpdate []*model.StoreSkuNamePrice
|
storeSkuNamePriceListUpdate []*model.StoreSkuNamePrice
|
||||||
skuBindInfosInter []interface{}
|
skuBindInfosInter []interface{}
|
||||||
skuBindInfoList []*StoreSkuBindInfo
|
skuBindInfoList []*StoreSkuBindInfo
|
||||||
|
errMsg string
|
||||||
|
isErr bool = false
|
||||||
)
|
)
|
||||||
dataLock.dataFailedList = dataLock.dataFailedList[0:0]
|
dataLock.dataFailedList = dataLock.dataFailedList[0:0]
|
||||||
dataLock.dataSuccessList = dataLock.dataSuccessList[0:0]
|
dataLock.dataSuccessList = dataLock.dataSuccessList[0:0]
|
||||||
@@ -2193,7 +2196,6 @@ func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io.
|
|||||||
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||||
switch step {
|
switch step {
|
||||||
case 0:
|
case 0:
|
||||||
// xlsx, err := excelize.OpenFile("111.xlsx")
|
|
||||||
xlsx, err := excelize.OpenReader(reader)
|
xlsx, err := excelize.OpenReader(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
@@ -2204,9 +2206,14 @@ func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io.
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
storeSkuNamePrice := &model.StoreSkuNamePrice{}
|
storeSkuNamePrice := &model.StoreSkuNamePrice{}
|
||||||
GetCellIntoStruct(rowNum, row, sheetParam, storeSkuNamePrice)
|
errMsg += GetCellIntoStruct(rowNum, row, sheetParam, storeSkuNamePrice)
|
||||||
storeSkuNamePriceList = append(storeSkuNamePriceList, storeSkuNamePrice)
|
storeSkuNamePriceList = append(storeSkuNamePriceList, storeSkuNamePrice)
|
||||||
}
|
}
|
||||||
|
if errMsg != "" {
|
||||||
|
return "", errors.New(errMsg)
|
||||||
|
} else {
|
||||||
|
isErr = true
|
||||||
|
}
|
||||||
case 1:
|
case 1:
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeSkuNamePriceListOrg, _ := dao.GetStoreSkuNamePrice(db)
|
storeSkuNamePriceListOrg, _ := dao.GetStoreSkuNamePrice(db)
|
||||||
@@ -2229,18 +2236,24 @@ func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io.
|
|||||||
skuList, err2 := dao.GetStoreSkusByNameIDs(db, []int{vv}, nameID)
|
skuList, err2 := dao.GetStoreSkusByNameIDs(db, []int{vv}, nameID)
|
||||||
err = err2
|
err = err2
|
||||||
if len(skuList) > 0 {
|
if len(skuList) > 0 {
|
||||||
|
unitPrice := 0
|
||||||
|
if storeSkuNamePrice.Unit == "KG" {
|
||||||
|
unitPrice = storeSkuNamePrice.Price / 2
|
||||||
|
} else {
|
||||||
|
unitPrice = storeSkuNamePrice.Price
|
||||||
|
}
|
||||||
storeSkuBindInfo := &StoreSkuBindInfo{
|
storeSkuBindInfo := &StoreSkuBindInfo{
|
||||||
NameID: nameID,
|
NameID: nameID,
|
||||||
UnitPrice: storeSkuNamePrice.Price,
|
UnitPrice: unitPrice,
|
||||||
}
|
}
|
||||||
skuBindInfos = append(skuBindInfos, storeSkuBindInfo)
|
skuBindInfos = append(skuBindInfos, storeSkuBindInfo)
|
||||||
outSuccess := DataSuccess{
|
outSuccess := DataSuccess{
|
||||||
NameID: nameID,
|
NameID: nameID,
|
||||||
Name: skuList[0].Name,
|
Name: skuList[0].Name,
|
||||||
Unit: storeSkuNamePrice.Unit,
|
Unit: storeSkuNamePrice.Unit,
|
||||||
OrgPrice: utils.Str2Float64(utils.Int64ToStr(skuList[0].UnitPrice / 100)),
|
OrgPrice: utils.Str2Float64(utils.Int64ToStr(skuList[0].UnitPrice)) / 100,
|
||||||
NowPrice: utils.Str2Float64(utils.Int64ToStr(int64(storeSkuNamePrice.Price / 100))),
|
NowPrice: utils.Str2Float64(utils.Int64ToStr(int64(unitPrice))) / 100,
|
||||||
MixPrice: utils.Str2Float64(utils.Int64ToStr(int64(storeSkuNamePrice.Price) - skuList[0].UnitPrice)),
|
MixPrice: utils.Str2Float64(utils.Int64ToStr(int64(unitPrice)-skuList[0].UnitPrice)) / 100,
|
||||||
}
|
}
|
||||||
dataLock.AppendDataSuccess(outSuccess)
|
dataLock.AppendDataSuccess(outSuccess)
|
||||||
} else {
|
} else {
|
||||||
@@ -2274,7 +2287,9 @@ func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io.
|
|||||||
for _, v := range skuBindInfosInter {
|
for _, v := range skuBindInfosInter {
|
||||||
skuBindInfoList = append(skuBindInfoList, v.(*StoreSkuBindInfo))
|
skuBindInfoList = append(skuBindInfoList, v.(*StoreSkuBindInfo))
|
||||||
}
|
}
|
||||||
|
if isErr {
|
||||||
UpdateStoresSkus(ctx, storeIDs, skuBindInfoList, false, isAsync, isContinueWhenError)
|
UpdateStoresSkus(ctx, storeIDs, skuBindInfoList, false, isAsync, isContinueWhenError)
|
||||||
|
}
|
||||||
case 3:
|
case 3:
|
||||||
//写Excel
|
//写Excel
|
||||||
WriteToExcelJx(task, dataLock.dataSuccessList, dataLock.dataFailedList)
|
WriteToExcelJx(task, dataLock.dataSuccessList, dataLock.dataFailedList)
|
||||||
@@ -2361,9 +2376,12 @@ func StoreSkuNamePriceList2Map(ctx *jxcontext.Context, storeSkuNamePriceList []*
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetCellIntoStruct(rowNum int, row []string, sheetParam *SheetParam, storeSkuNamePrice *model.StoreSkuNamePrice) {
|
func GetCellIntoStruct(rowNum int, row []string, sheetParam *SheetParam, storeSkuNamePrice *model.StoreSkuNamePrice) (errMsg string) {
|
||||||
for k, cell := range row {
|
for k, cell := range row {
|
||||||
if k == sheetParam.OutSkuIDCol {
|
if k == sheetParam.OutSkuIDCol {
|
||||||
|
if IsChineseChar(cell) {
|
||||||
|
return fmt.Sprintf("Excel格式排版发生了变化!在[%v]列,[%v]行附近可能增加或减少了一列", k+1, rowNum+1)
|
||||||
|
}
|
||||||
storeSkuNamePrice.OutSkuID = cell
|
storeSkuNamePrice.OutSkuID = cell
|
||||||
}
|
}
|
||||||
if k == sheetParam.SkuNameCol {
|
if k == sheetParam.SkuNameCol {
|
||||||
@@ -2379,12 +2397,16 @@ func GetCellIntoStruct(rowNum int, row []string, sheetParam *SheetParam, storeSk
|
|||||||
storeSkuNamePrice.NameIDGroup = cellReplace
|
storeSkuNamePrice.NameIDGroup = cellReplace
|
||||||
}
|
}
|
||||||
if k == sheetParam.SkuPriceCol {
|
if k == sheetParam.SkuPriceCol {
|
||||||
|
if IsChineseChar(cell) {
|
||||||
|
return fmt.Sprintf("Excel格式排版发生了变化!在[%v]列,[%v]行附近可能增加或减少了一列", k+1, rowNum+1)
|
||||||
|
}
|
||||||
storeSkuNamePrice.Price = int(utils.Float64TwoInt64(utils.Str2Float64(cell) * 100))
|
storeSkuNamePrice.Price = int(utils.Float64TwoInt64(utils.Str2Float64(cell) * 100))
|
||||||
}
|
}
|
||||||
if k == sheetParam.SkuUnitCol {
|
if k == sheetParam.SkuUnitCol {
|
||||||
storeSkuNamePrice.Unit = cell
|
storeSkuNamePrice.Unit = cell
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return errMsg
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DataLock) AppendDataSuccess(dataSuccess DataSuccess) {
|
func (d *DataLock) AppendDataSuccess(dataSuccess DataSuccess) {
|
||||||
@@ -2398,3 +2420,12 @@ func (d *DataLock) AppendDataFailed(dataFailed DataFailed) {
|
|||||||
defer d.locker.Unlock()
|
defer d.locker.Unlock()
|
||||||
d.dataFailedList = append(d.dataFailedList, dataFailed)
|
d.dataFailedList = append(d.dataFailedList, dataFailed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsChineseChar(str string) bool {
|
||||||
|
for _, r := range str {
|
||||||
|
if unicode.Is(unicode.Scripts["Han"], r) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api/apimanager"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
"git.rosy.net.cn/baseapi/platformapi/jdapi"
|
"git.rosy.net.cn/baseapi/platformapi/jdapi"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
|
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
|
||||||
@@ -814,31 +818,33 @@ func GetJdUsers(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint
|
|||||||
)
|
)
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
jdUsersStruct.userMap = jdUsersStruct.userMap[0:0]
|
jdUsersStruct.userMap = jdUsersStruct.userMap[0:0]
|
||||||
//获取京东商城所有用户
|
|
||||||
_, _, toatlPage, _ := api.JdAPI.PrivilegeSearchUser(1)
|
|
||||||
for i := 1; i <= toatlPage; i++ {
|
|
||||||
pageNoList = append(pageNoList, i)
|
|
||||||
}
|
|
||||||
storeMapList, err := dao.GetStoreMapsListWithoutDisabled(db, []int{model.VendorIDJD}, model.StoreStatusDisabled)
|
|
||||||
for _, v := range storeMapList {
|
|
||||||
jxVendorIDsMap[v.VendorStoreID] = utils.Int64ToStr(int64(v.StoreID))
|
|
||||||
}
|
|
||||||
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||||
switch step {
|
switch step {
|
||||||
case 0:
|
case 0:
|
||||||
|
//获取京东商城所有用户
|
||||||
|
apiList := apimanager.CurAPIManager.GetAppOrgCodeList(model.VendorIDJD)
|
||||||
|
for _, v := range apiList {
|
||||||
|
_, _, toatlPage, _ := jd.GetAPI(v).PrivilegeSearchUser(1)
|
||||||
|
for i := 1; i <= toatlPage; i++ {
|
||||||
|
pageNoList = append(pageNoList, i)
|
||||||
|
}
|
||||||
|
storeMapList, _ := dao.GetStoreMapsListWithoutDisabled(db, []int{model.VendorIDJD}, model.StoreStatusDisabled)
|
||||||
|
for _, v := range storeMapList {
|
||||||
|
jxVendorIDsMap[v.VendorStoreID] = utils.Int64ToStr(int64(v.StoreID))
|
||||||
|
}
|
||||||
taskFunc1 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
taskFunc1 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
pageNo := batchItemList[0].(int)
|
pageNo := batchItemList[0].(int)
|
||||||
storeUserLists, _, _, err := api.JdAPI.PrivilegeSearchUser(pageNo)
|
storeUserLists, _, _, err := jd.GetAPI(v).PrivilegeSearchUser(pageNo)
|
||||||
retVal = storeUserLists
|
retVal = storeUserLists
|
||||||
return retVal, err
|
return retVal, err
|
||||||
}
|
}
|
||||||
taskParallel1 := tasksch.NewParallelTask("获取京东商城所有用户列表", tasksch.NewParallelConfig(), ctx, taskFunc1, pageNoList)
|
taskParallel1 := tasksch.NewParallelTask("获取京东商城所有用户列表", tasksch.NewParallelConfig(), ctx, taskFunc1, pageNoList)
|
||||||
tasksch.HandleTask(taskParallel1, task, true).Run()
|
tasksch.HandleTask(taskParallel1, task, true).Run()
|
||||||
storeUserList, err = taskParallel1.GetResult(0)
|
storeUserList, err = taskParallel1.GetResult(0)
|
||||||
case 1:
|
|
||||||
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
vv := batchItemList[0].(*jdapi.StoreUserInfo)
|
vv := batchItemList[0].(*jdapi.StoreUserInfo)
|
||||||
vendorStoreIDs, err := api.JdAPI.GetJdUserBindStoreIDs(vv.ID)
|
vendorStoreIDs, err := jd.GetAPI(v).GetJdUserBindStoreIDs(vv.ID)
|
||||||
var vendorStoreIDsMap = make(map[string]string, len(vendorStoreIDs))
|
var vendorStoreIDsMap = make(map[string]string, len(vendorStoreIDs))
|
||||||
var vendorStoreIDsResult []string
|
var vendorStoreIDsResult []string
|
||||||
var roleNameStr string
|
var roleNameStr string
|
||||||
@@ -851,11 +857,11 @@ func GetJdUsers(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint
|
|||||||
if vv.RoleNameStr != "" {
|
if vv.RoleNameStr != "" {
|
||||||
roleNameStr = strings.ReplaceAll(vv.RoleNameStr, " ", "")
|
roleNameStr = strings.ReplaceAll(vv.RoleNameStr, " ", "")
|
||||||
if roleNameStr != jdapi.JdUserRoleJHYName && roleNameStr != jdapi.JdUserRolesName && roleNameStr != jdapi.JdUserNoRole {
|
if roleNameStr != jdapi.JdUserRoleJHYName && roleNameStr != jdapi.JdUserRolesName && roleNameStr != jdapi.JdUserNoRole {
|
||||||
api.JdAPI.UpdateJdUserRoles(int64(vv.ID), []string{jdapi.JdUserRoleJHYId})
|
jd.GetAPI(v).UpdateJdUserRoles(int64(vv.ID), []string{jdapi.JdUserRoleJHYId})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(vendorStoreIDsMap) == 0 {
|
if len(vendorStoreIDsMap) == 0 {
|
||||||
isManager, _ := api.JdAPI.IsJdManagerUser(int64(vv.ID))
|
isManager, _ := jd.GetAPI(v).IsJdManagerUser(int64(vv.ID))
|
||||||
if isManager {
|
if isManager {
|
||||||
jdStruct := JdUserStruct{vv.LoginName, "商家管理员", vv.RoleNameStr, vv.LockStatus}
|
jdStruct := JdUserStruct{vv.LoginName, "商家管理员", vv.RoleNameStr, vv.LockStatus}
|
||||||
jdUsersStruct.AppendData(jdStruct)
|
jdUsersStruct.AppendData(jdStruct)
|
||||||
@@ -875,21 +881,22 @@ func GetJdUsers(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint
|
|||||||
taskParallel := tasksch.NewParallelTask("获取京东商城用户关联门店列表", tasksch.NewParallelConfig(), ctx, taskFunc, storeUserList)
|
taskParallel := tasksch.NewParallelTask("获取京东商城用户关联门店列表", tasksch.NewParallelConfig(), ctx, taskFunc, storeUserList)
|
||||||
tasksch.HandleTask(taskParallel, task, true).Run()
|
tasksch.HandleTask(taskParallel, task, true).Run()
|
||||||
disabledIdList, err = taskParallel.GetResult(0)
|
disabledIdList, err = taskParallel.GetResult(0)
|
||||||
case 2:
|
|
||||||
taskFunc2 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
taskFunc2 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
id := batchItemList[0].(int64)
|
id := batchItemList[0].(int64)
|
||||||
api.JdAPI.PrivilegeUpdateJdUserStatus(id, jdapi.JdUserStatusDisable)
|
jd.GetAPI(v).PrivilegeUpdateJdUserStatus(id, jdapi.JdUserStatusDisable)
|
||||||
return retVal, err
|
return retVal, err
|
||||||
}
|
}
|
||||||
taskParallel2 := tasksch.NewParallelTask("禁用未关联活跃门店用户", tasksch.NewParallelConfig(), ctx, taskFunc2, disabledIdList)
|
taskParallel2 := tasksch.NewParallelTask("禁用未关联活跃门店用户", tasksch.NewParallelConfig(), ctx, taskFunc2, disabledIdList)
|
||||||
tasksch.HandleTask(taskParallel2, task, true).Run()
|
tasksch.HandleTask(taskParallel2, task, true).Run()
|
||||||
_, err = taskParallel2.GetResult(0)
|
_, err = taskParallel2.GetResult(0)
|
||||||
case 3:
|
}
|
||||||
|
case 1:
|
||||||
WriteToExcelJd(task, jdUsersStruct.userMap)
|
WriteToExcelJd(task, jdUsersStruct.userMap)
|
||||||
}
|
}
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
taskSeq := tasksch.NewSeqTask2("获取京东商城用户关联门店列表-序列任务", ctx, isContinueWhenError, taskSeqFunc, 4)
|
taskSeq := tasksch.NewSeqTask2("获取京东商城用户关联门店列表-序列任务", ctx, isContinueWhenError, taskSeqFunc, 2)
|
||||||
tasksch.HandleTask(taskSeq, nil, true).Run()
|
tasksch.HandleTask(taskSeq, nil, true).Run()
|
||||||
if !isAsync {
|
if !isAsync {
|
||||||
_, err = taskSeq.GetResult(0)
|
_, err = taskSeq.GetResult(0)
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
"unicode"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
@@ -555,15 +554,6 @@ func GetWeiMobGoodsList(param *weimobapi.QueryGoodsListParam) (goodsList []*weim
|
|||||||
return goodsList, err
|
return goodsList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsChineseChar(str string) bool {
|
|
||||||
for _, r := range str {
|
|
||||||
if unicode.Is(unicode.Scripts["Han"], r) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row []string, sheetName string, rowNum int) (errMsg string) {
|
func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row []string, sheetName string, rowNum int) (errMsg string) {
|
||||||
var (
|
var (
|
||||||
skuID string
|
skuID string
|
||||||
@@ -613,12 +603,10 @@ func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row [
|
|||||||
}
|
}
|
||||||
if rowNum >= sheetParam.SkuRow {
|
if rowNum >= sheetParam.SkuRow {
|
||||||
if rowNum == sheetParam.SkuRow {
|
if rowNum == sheetParam.SkuRow {
|
||||||
if IsChineseChar(skuID) {
|
if cms.IsChineseChar(skuID) {
|
||||||
if IsChineseChar(skuID) {
|
|
||||||
errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]行附近可能增加了一行,请确认!", sheetName, rowNum)
|
errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]行附近可能增加了一行,请确认!", sheetName, rowNum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if len(skuMap) > 0 {
|
if len(skuMap) > 0 {
|
||||||
if skuMap[skuID] != nil {
|
if skuMap[skuID] != nil {
|
||||||
if skuMap[skuID].Price != 0 && skuMap[skuID].Price != skuPrice && skuPrice != 0 {
|
if skuMap[skuID].Price != 0 && skuMap[skuID].Price != skuPrice && skuPrice != 0 {
|
||||||
@@ -649,7 +637,7 @@ func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row [
|
|||||||
delete(skuMap, "")
|
delete(skuMap, "")
|
||||||
} else {
|
} else {
|
||||||
for i := rowNum; i < sheetParam.SkuRow; i++ {
|
for i := rowNum; i < sheetParam.SkuRow; i++ {
|
||||||
if !IsChineseChar(skuID) {
|
if !cms.IsChineseChar(skuID) {
|
||||||
errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]行附近可能减少了一行,请确认!", sheetName, rowNum)
|
errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]行附近可能减少了一行,请确认!", sheetName, rowNum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user