优化店铺管理模块

This commit is contained in:
Richie 2025-05-20 20:05:16 +08:00
parent b1230e88f3
commit e852ab1096
31 changed files with 156 additions and 77 deletions

View File

@ -80,7 +80,7 @@ public class ShopController extends BaseController {
{
if(shop.getType()==null) return AjaxResult.error("请选择店铺平台");
shop.setModifyOn(System.currentTimeMillis()/1000);
shop.setCreateOn(System.currentTimeMillis()/1000);
// shop.setCreateTime(new Date());
return toAjax(shopService.save(shop));
}

View File

@ -87,9 +87,9 @@
<dependency>
<groupId>cn.qihangerp.open</groupId>
<artifactId>open-sdk</artifactId>
<version>1.0.2</version>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/open-sdk-1.4.30.jar</systemPath>
<systemPath>${project.basedir}/libs/open-sdk-1.5.1.jar</systemPath>
</dependency>
<dependency>

View File

@ -13,7 +13,7 @@ public enum ResultVoEnum {
TokenFail("TokenFail", 1401),//没有找到
Unable("Unable", 1403),//无法处理
UNAUTHORIZED("UNAUTHORIZED", 1401),//token过期
StateError("StateError", 1402),//状态错误
StateError("StateError", 1502),//状态错误
Locking("Locking", 1405),//锁定不能操作
NumberLess("数量不足", 1406),
StatusError("状态不正确", 1407),
@ -23,7 +23,8 @@ public enum ResultVoEnum {
HasAssociatedData("存在关联数据", 1501),//存在关联数据
Exist("已存在相同的数据", 1502),//已存在相同的数据
SystemException("系统异常", 1505),//系统异常
Fail("失败", 1001);
Fail("失败", 1001),
API_FAIL("失败", 2001);
private String name;
private int index;

View File

@ -1,21 +1,24 @@
package cn.qihangerp.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* 数据中心-店铺
* @TableName sys_shop
* 店铺
* @TableName o_shop
*/
@TableName(value ="o_shop")
@Data
public class OShop implements Serializable {
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;
/**
@ -43,11 +46,6 @@ public class OShop implements Serializable {
*/
private Integer status;
/**
* 更新时间
*/
private Long modifyOn;
/**
* 描述
*/
@ -66,7 +64,7 @@ public class OShop implements Serializable {
/**
* Appsercet
*/
private String appSercet;
private String appSecret;
/**
* 第三方平台sessionKeyaccess_token
@ -98,7 +96,36 @@ public class OShop implements Serializable {
*/
private String apiRequestUrl;
/**
* 回调url
*/
private String apiRedirectUrl;
/**
* 负责人id
*/
private Long manageUserId;
/**
* 负责人部门id
*/
private Long manageDeptId;
/**
* 国家/地区
*/
private Long regionId;
/**
* 更新时间
*/
private Long modifyOn;
/**
* 创建时间
*/
private Long createOn;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -21,9 +21,9 @@
<dependency>
<groupId>cn.qihangerp.open</groupId>
<artifactId>open-sdk</artifactId>
<version>1.0.2</version>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/open-sdk-1.4.20.jar</systemPath>
<systemPath>${project.basedir}/libs/open-sdk-1.5.1.jar</systemPath>
</dependency>
<dependency>
<groupId>cn.qihangerp.module</groupId>

View File

@ -1,12 +1,16 @@
package cn.qihangerp.api.dou;
import cn.qihangerp.common.ResultVo;
import cn.qihangerp.common.ResultVoEnum;
import cn.qihangerp.common.api.ShopApiParams;
import cn.qihangerp.common.enums.EnumShopType;
import cn.qihangerp.common.enums.HttpStatus;
import cn.qihangerp.domain.OShopPlatform;
import cn.qihangerp.module.service.OShopPlatformService;
import cn.qihangerp.module.service.OShopService;
import cn.qihangerp.open.common.ApiResultVo;
import cn.qihangerp.sdk.dou.DouTokenApiHelper;
import cn.qihangerp.sdk.dou.model.Token;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@ -15,7 +19,7 @@ import org.springframework.util.StringUtils;
@Component
public class DouApiCommon {
private final OShopService shopService;
private final OShopPlatformService platformService;
// private final OShopPlatformService platformService;
/**
* 更新前的检查
@ -39,13 +43,13 @@ public class DouApiCommon {
return ResultVo.error(HttpStatus.PARAMS_ERROR, "参数错误请设置抖店平台店铺IDshopId");
}
OShopPlatform platform = platformService.getById(EnumShopType.DOU.getIndex());
// OShopPlatform platform = platformService.getById(EnumShopType.DOU.getIndex());
if (!StringUtils.hasText(platform.getAppKey())) {
return ResultVo.error(HttpStatus.PARAMS_ERROR, "平台配置错误没有找到AppKey");
if (!StringUtils.hasText(shop.getAppKey())) {
return ResultVo.error(HttpStatus.PARAMS_ERROR, "店铺配置错误没有找到AppKey");
}
if (!StringUtils.hasText(platform.getAppSecret())) {
return ResultVo.error(HttpStatus.PARAMS_ERROR, "第三方平台配置错误没有找到AppSercet");
if (!StringUtils.hasText(shop.getAppSecret())) {
return ResultVo.error(HttpStatus.PARAMS_ERROR, "店铺配置错误没有找到AppSecret");
}
// if (!StringUtils.hasText(platform.getRedirectUri())) {
// return ResultVo.error(HttpStatus.PARAMS_ERROR, "第三方平台配置错误没有找到RedirectUri");
@ -59,16 +63,28 @@ public class DouApiCommon {
// }
ShopApiParams params = new ShopApiParams();
params.setAppKey(platform.getAppKey());
params.setAppSecret(platform.getAppSecret());
params.setAppKey(shop.getAppKey());
params.setAppSecret(shop.getAppSecret());
params.setAccessToken(shop.getAccessToken());
params.setRedirectUri(platform.getRedirectUri());
params.setServerUrl(platform.getServerUrl());
params.setRedirectUri(shop.getApiRedirectUrl());
// params.setServerUrl(platform.getServerUrl());
params.setSellerId(shop.getSellerId());
// if (!StringUtils.hasText(shop.getAccessToken())) {
// return ResultVo.error(HttpStatus.UNAUTHORIZED, "Token已过期请重新授权", params);
// }
if (!StringUtils.hasText(shop.getAccessToken())) {
ApiResultVo<Token> token = DouTokenApiHelper.getToken(shop.getAppKey(), shop.getAppSecret(), shop.getSellerId());
if(token.getCode()!=0) {
return ResultVo.error(ResultVoEnum.API_FAIL.getIndex(), token.getMsg(), params);
}else{
shopService.updateSessionKey(shopId,token.getData().getAccessToken(),token.getData().getRefreshToken());
params.setAccessToken(token.getData().getAccessToken());
}
}else{
ApiResultVo<Token> token1= DouTokenApiHelper.refreshToken(shop.getAppKey(),shop.getAppSecret(),shop.getAccessToken(),shop.getRefreshToken());
if(token1.getCode()==0){
shopService.updateSessionKey(shopId,token1.getData().getAccessToken(),token1.getData().getRefreshToken());
params.setAccessToken(token1.getData().getAccessToken());
}
}
return ResultVo.success(HttpStatus.SUCCESS, params);
}

View File

@ -57,7 +57,7 @@ public class DouGoodsApiController {
Date currDateTime = new Date();
var checkResult = douApiCommon.checkBefore(params.getShopId());
if (checkResult.getCode() != HttpStatus.SUCCESS) {
return AjaxResult.error(checkResult.getCode(), checkResult.getMsg(), checkResult.getData());
return AjaxResult.error(checkResult.getCode(), checkResult.getMsg());
}
String accessToken = checkResult.getData().getAccessToken();
String serverUrl = checkResult.getData().getServerUrl();

View File

@ -18,7 +18,6 @@ import cn.qihangerp.module.service.OShopPullLasttimeService;
import cn.qihangerp.module.service.OShopPullLogsService;
import cn.qihangerp.open.common.ApiResultVo;
import cn.qihangerp.open.dou.DouOrderApiHelper;
import cn.qihangerp.open.dou.DouTokenApiHelper;
import cn.qihangerp.open.dou.model.Token;
import cn.qihangerp.open.dou.model.order.Order;
import cn.qihangerp.sdk.dou.PullRequest;
@ -104,15 +103,14 @@ public class DouOrderApiController {
Long endTimestamp = endTime.toEpochSecond(ZoneOffset.ofHours(8));
String pullParams = "{startTime:"+startTime+",endTime:"+endTime+"}";
ApiResultVo<Token> token = DouTokenApiHelper.getToken(appKey, appSecret,checkResult.getData().getSellerId());
if(token.getCode()==0) {
accessToken = token.getData().getAccessToken();
}else{
return AjaxResult.error(token.getMsg());
}
// ApiResultVo<Token> token = DouTokenApiHelper.getToken(appKey, appSecret,checkResult.getData().getSellerId());
//
// if(token.getCode()==0) {
// accessToken = token.getData().getAccessToken();
// }else{
// return AjaxResult.error(token.getMsg());
// }
//第一次获取
// ApiResultVo<DouOrderResponse> resultVo = OrderApiHelper.pullOrderList(appKey,appSecret,douShopId,startTime, endTime);
ApiResultVo<Order> resultVo = DouOrderApiHelper.pullOrderList(startTimestamp, endTimestamp, 0, 20, appKey, appSecret, accessToken);
if(resultVo.getCode() !=0 ){
OShopPullLogs logs = new OShopPullLogs();

View File

@ -1,6 +1,5 @@
package cn.qihangerp.api.dou.controller;
import cn.qihangerp.api.dou.DouApiCommon;
import cn.qihangerp.common.AjaxResult;
import cn.qihangerp.common.ResultVoEnum;
@ -15,11 +14,8 @@ import cn.qihangerp.module.open.dou.domain.DouRefund;
import cn.qihangerp.module.open.dou.service.DouRefundService;
import cn.qihangerp.module.service.OShopPullLasttimeService;
import cn.qihangerp.module.service.OShopPullLogsService;
import cn.qihangerp.open.common.ApiResultVo;
import cn.qihangerp.open.dou.DouRefundApiHelper;
import cn.qihangerp.open.dou.DouTokenApiHelper;
import cn.qihangerp.open.dou.model.Token;
import cn.qihangerp.open.dou.model.after.AfterSale;
import cn.qihangerp.sdk.dou.PullRequest;
@ -102,12 +98,12 @@ public class DouRefundApiController {
// }
}
String pullParams = "{startTime:"+startTime+",endTime:"+endTime+"}";
ApiResultVo<Token> token = DouTokenApiHelper.getToken(appKey, appSecret,checkResult.getData().getSellerId());
if(token.getCode()==0) {
accessToken = token.getData().getAccessToken();
}else{
return AjaxResult.error(token.getMsg());
}
// ApiResultVo<Token> token = DouTokenApiHelper.getToken(appKey, appSecret,checkResult.getData().getSellerId());
// if(token.getCode()==0) {
// accessToken = token.getData().getAccessToken();
// }else{
// return AjaxResult.error(token.getMsg());
// }
String startTimeStr = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String endTimeStr = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Long startTimestamp = startTime.toEpochSecond(ZoneOffset.ofHours(8));

View File

@ -23,7 +23,7 @@
<artifactId>open-sdk</artifactId>
<version>1.0.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/open-sdk-1.4.20.jar</systemPath>
<systemPath>${project.basedir}/libs/open-sdk-1.5.1.jar</systemPath>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>

View File

@ -23,7 +23,7 @@
<artifactId>open-sdk</artifactId>
<version>1.0.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/open-sdk-1.4.20.jar</systemPath>
<systemPath>${project.basedir}/libs/open-sdk-1.5.1.jar</systemPath>
</dependency>
<dependency>
<groupId>cn.qihangerp.module</groupId>

View File

@ -68,6 +68,13 @@
<artifactId>security</artifactId>
<version>1.0</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>cn.qihangerp.open</groupId>-->
<!-- <artifactId>open-sdk</artifactId>-->
<!-- <version>1.0</version>-->
<!-- <scope>system</scope>-->
<!-- <systemPath>${project.basedir}/libs/open-sdk-1.5.1.jar</systemPath>-->
<!-- </dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

Binary file not shown.

View File

@ -23,7 +23,7 @@
<artifactId>open-sdk</artifactId>
<version>1.0.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/open-sdk-1.4.20.jar</systemPath>
<systemPath>${project.basedir}/libs/open-sdk-1.5.1.jar</systemPath>
</dependency>
<dependency>
<groupId>cn.qihangerp.module</groupId>

Binary file not shown.

View File

@ -23,7 +23,7 @@
<artifactId>open-sdk</artifactId>
<version>1.0.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/open-sdk-1.4.20.jar</systemPath>
<systemPath>${project.basedir}/libs/open-sdk-1.5.1.jar</systemPath>
</dependency>
<dependency>
<groupId>cn.qihangerp.module</groupId>

View File

@ -36,7 +36,7 @@ public class WeiApiCommon {
if(!StringUtils.hasText(shop.getAppKey())) {
return ResultVo.error(HttpStatus.PARAMS_ERROR, "店铺参数配置错误没有找到AppKey");
}
if(!StringUtils.hasText(shop.getAppSercet())) {
if(!StringUtils.hasText(shop.getAppSecret())) {
return ResultVo.error(HttpStatus.PARAMS_ERROR, "店铺参数配置错误没有找到AppSercet");
}
if(!StringUtils.hasText(shop.getApiRequestUrl())) {
@ -45,7 +45,7 @@ public class WeiApiCommon {
ShopApiParams params = new ShopApiParams();
params.setAppKey(shop.getAppKey());
params.setAppSecret(shop.getAppSercet());
params.setAppSecret(shop.getAppSecret());
params.setAccessToken(shop.getAccessToken());
params.setServerUrl(shop.getApiRequestUrl());
params.setSellerId(shop.getSellerId());

View File

@ -5,9 +5,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author qilip
* @description 针对表sys_shop(数据中心-店铺)的数据库操作Mapper
* @createDate 2024-03-17 15:17:34
* @Entity cn.qihangerp.oms.domain.SysShop
* @description 针对表o_shop(店铺表)的数据库操作Mapper
* @createDate 2025-05-20 18:28:35
* @Entity cn.qihangerp.module.domain.OShop
*/
public interface OShopMapper extends BaseMapper<OShop> {

View File

@ -23,4 +23,5 @@ public interface OShopService extends IService<OShop> {
// int updateShopPlatformById(SysPlatform platform);
List<OShop> selectShopByShopType(EnumShopType shopType);
void updateSessionKey(Long shopId,String sessionKey);
void updateSessionKey(Long shopId,String token,String refreshToken);
}

View File

@ -68,6 +68,14 @@ public class OShopServiceImpl extends ServiceImpl<OShopMapper, OShop>
shop.setAccessToken(sessionKey);
mapper.updateById(shop);
}
@Override
public void updateSessionKey(Long shopId, String token, String refreshToken) {
OShop shop = new OShop();
shop.setId(shopId);
shop.setAccessToken(token);
shop.setRefreshToken(refreshToken);
mapper.updateById(shop);
}
// @Override
// public List<SysPlatform> selectShopPlatformList() {
// return platformMapper.selectList(new LambdaQueryWrapper<>());

View File

@ -5,31 +5,38 @@
<mapper namespace="cn.qihangerp.module.mapper.OShopMapper">
<resultMap id="BaseResultMap" type="cn.qihangerp.domain.OShop">
<id property="id" column="id" jdbcType="INTEGER"/>
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="type" column="type" jdbcType="INTEGER"/>
<result property="url" column="url" jdbcType="VARCHAR"/>
<result property="sort" column="sort" jdbcType="INTEGER"/>
<result property="status" column="status" jdbcType="INTEGER"/>
<result property="modifyOn" column="modify_on" jdbcType="BIGINT"/>
<result property="remark" column="remark" jdbcType="VARCHAR"/>
<result property="sellerId" column="seller_id" jdbcType="BIGINT"/>
<result property="appKey" column="app_key" jdbcType="VARCHAR"/>
<result property="appSercet" column="app_sercet" jdbcType="VARCHAR"/>
<result property="appSecret" column="app_secret" jdbcType="VARCHAR"/>
<result property="accessToken" column="access_token" jdbcType="VARCHAR"/>
<result property="expiresIn" column="expires_in" jdbcType="BIGINT"/>
<result property="accessTokenBegin" column="access_token_begin" jdbcType="BIGINT"/>
<result property="refreshToken" column="refresh_token" jdbcType="VARCHAR"/>
<result property="refreshTokenTimeout" column="refresh_token_timeout" jdbcType="BIGINT"/>
<result property="apiRequestUrl" column="api_request_url" jdbcType="VARCHAR"/>
<result property="apiRedirectUrl" column="api_redirect_url" jdbcType="VARCHAR"/>
<result property="manageUserId" column="manage_user_id" jdbcType="BIGINT"/>
<result property="manageDeptId" column="manage_dept_id" jdbcType="BIGINT"/>
<result property="regionId" column="region_id" jdbcType="BIGINT"/>
<result property="modifyOn" column="modify_on" jdbcType="BIGINT"/>
<result property="createOn" column="create_on" jdbcType="BIGINT"/>
</resultMap>
<sql id="Base_Column_List">
id,name,type,
url,sort,status,
modify_on,remark,seller_id,
app_key,app_sercet,access_token,
expires_in,access_token_begin,refresh_token,
refresh_token_timeout,api_request_url
remark,seller_id,app_key,
app_secret,access_token,expires_in,
access_token_begin,refresh_token,refresh_token_timeout,
api_request_url,api_redirect_url,manage_user_id,
manage_dept_id,region_id,modify_on,
create_on
</sql>
</mapper>

View File

@ -75,7 +75,10 @@ service.interceptors.response.use(res => {
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
}
if (code === 401) {
if(code>1000){
return res.data
}
else if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {

View File

@ -330,10 +330,13 @@ export default {
});
// return Promise.reject('')
}else{
}else if(response.code==200){
this.pullLoading = false
this.getList()
this.$modal.msgSuccess(JSON.stringify(response));
}else{
this.pullLoading = false
this.$modal.msgError(response.msg);
}
this.pullLoading = false

View File

@ -133,13 +133,10 @@
<!-- 添加或修改店铺对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="店铺名" prop="name">
<el-input v-model="form.name" placeholder="请输入店铺名" />
</el-form-item>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="平台" prop="type">
<el-select v-model="form.type" placeholder="请选择平台">
<el-option
<el-option
v-for="item in typeList"
:key="item.id"
:label="item.name"
@ -147,10 +144,22 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="卖家Id" prop="sellerId">
<el-input v-model="form.sellerId" placeholder="请输入卖家Id名" />
<el-form-item label="店铺名" prop="name">
<el-input v-model="form.name" placeholder="请输入店铺名" />
</el-form-item>
<el-form-item label="店铺卖家Id" prop="sellerId">
<el-input v-model="form.sellerId" placeholder="请输入卖家Id名" />
</el-form-item>
<el-form-item label="AppKey" prop="appKey">
<el-input v-model="form.appKey" placeholder="请输入AppKey" />
</el-form-item>
<el-form-item label="AppSecret" prop="appSecret">
<el-input v-model="form.appSecret" placeholder="请输入AppSecret" />
</el-form-item>
<el-form-item label="回调URL" prop="apiRedirectUrl">
<el-input v-model="form.apiRedirectUrl" placeholder="请输入回调URL" />
</el-form-item>
<el-form-item label="描述" prop="remark">
<el-input type="textarea" v-model="form.remark" placeholder="请输入描述" />
</el-form-item>
@ -250,7 +259,10 @@ export default {
name: [{ required: true, message: "店铺名不能为空", trigger: "blur" }],
type: [{ required: true, message: "请选择平台", trigger: "change" }],
sellerId: [{ required: true, message: "不能为空", trigger: "change" }],
code: [{ required: true, message: "不能为空", trigger: "change" }],
appKey: [{ required: true, message: "不能为空", trigger: "change" }],
appSecret: [{ required: true, message: "不能为空", trigger: "change" }],
status: [{ required: true, message: "不能为空", trigger: "change" }],
}
};
},