Răsfoiți Sursa

Merge branch 'dev' into dev-station-activity

# Conflicts:
#	service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java
skyline 2 ani în urmă
părinte
comite
604ae8f6eb
38 a modificat fișierele cu 268 adăugiri și 133 ștergeri
  1. 1 1
      admin-web/src/App.vue
  2. 1 1
      admin-web/src/components/form/ExtUpload.vue
  3. 1 1
      admin-web/src/router/backEnd.ts
  4. 1 1
      admin-web/src/router/frontEnd.ts
  5. 1 1
      admin-web/src/router/index.ts
  6. 2 2
      admin-web/src/utils/request.ts
  7. 4 4
      admin-web/src/utils/storage.ts
  8. 3 3
      admin-web/src/utils/u.ts
  9. 6 5
      admin-web/src/views/admin/station/endpoint/upload.vue
  10. 3 3
      admin-web/src/views/login/component/account.vue
  11. 1 1
      admin/src/main/java/com/kym/admin/config/SaTokenConfigure.java
  12. 10 3
      admin/src/main/java/com/kym/admin/controller/StationController.java
  13. 1 1
      admin/src/main/resources/application-dev.yml
  14. 2 2
      admin/src/main/resources/application-prod.yml
  15. 2 2
      admin/src/main/resources/application.yml
  16. 2 2
      common/pom.xml
  17. 1 1
      common/src/main/java/com/kym/common/handler/GlobalExceptionHandler.java
  18. 14 19
      entity/src/main/java/com/kym/entity/admin/EquipmentRelation.java
  19. 2 0
      entity/src/main/java/com/kym/entity/admin/Station.java
  20. 6 0
      entity/src/main/java/com/kym/entity/admin/queryParams/CommonQueryParam.java
  21. 4 1
      mapper/src/main/resources/mappers/admin/EquipmentRelationMapper.xml
  22. 1 1
      miniapp/src/main/java/com/kym/miniapp/config/SaTokenConfigure.java
  23. 12 5
      miniapp/src/main/java/com/kym/miniapp/controller/AccountController.java
  24. 3 3
      miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java
  25. 2 1
      miniapp/src/main/java/com/kym/miniapp/utils/MybatisPlusGeneratorForMiniApp.java
  26. 19 0
      service/src/main/java/com/kym/service/MyBaseService.java
  27. 32 0
      service/src/main/java/com/kym/service/MyBaseServiceImpl.java
  28. 3 2
      service/src/main/java/com/kym/service/admin/ConnectorInfoService.java
  29. 2 4
      service/src/main/java/com/kym/service/admin/EquipmentInfoService.java
  30. 6 1
      service/src/main/java/com/kym/service/admin/StationService.java
  31. 1 1
      service/src/main/java/com/kym/service/admin/impl/AdminUserServiceImpl.java
  32. 8 3
      service/src/main/java/com/kym/service/admin/impl/ConnectorInfoServiceImpl.java
  33. 2 2
      service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java
  34. 4 5
      service/src/main/java/com/kym/service/admin/impl/InvoiceDetailServiceImpl.java
  35. 91 51
      service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java
  36. 4 0
      service/src/main/java/com/kym/service/miniapp/RefundLogService.java
  37. 7 0
      service/src/main/java/com/kym/service/miniapp/impl/RefundLogServiceImpl.java
  38. 3 0
      service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

+ 1 - 1
admin-web/src/App.vue

@@ -97,7 +97,7 @@ onMounted(() => {
     });
 
 
-    if (Session.get('token')) {
+    if (Session.get('accessToken')) {
       refreshEnv();
     }
 	});

+ 1 - 1
admin-web/src/components/form/ExtUpload.vue

@@ -99,7 +99,7 @@ onMounted(() => {
     url = `${location.origin}/admin/`;
   }
   state.action = `${url}file/upload`
-  state.headers = {"satoken": Session.get("token")}
+  state.headers = {"accessToken": Session.get("accessToken")}
 })
 
 const handleAvatarError = () => {

+ 1 - 1
admin-web/src/router/backEnd.ts

@@ -35,7 +35,7 @@ export async function initBackEndControlRoutes() {
 	// 界面 loading 动画开始执行
 	// if (window.nextLoading === undefined) NextLoading.start();
 	// 无 token 停止执行下一步
-	if (!Session.get('token')) return false;
+	if (!Session.get('accessToken')) return false;
 	// 触发初始化用户信息 pinia
 	// https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
 	await useUserInfo().setUserInfos(null);

+ 1 - 1
admin-web/src/router/frontEnd.ts

@@ -22,7 +22,7 @@ export async function initFrontEndControlRoutes() {
 	// 界面 loading 动画开始执行
 	if (window.nextLoading === undefined) NextLoading.start();
 	// 无 token 停止执行下一步
-	if (!Session.get('token')) return false;
+	if (!Session.get('accessToken')) return false;
 	// 触发初始化用户信息 pinia
 	// https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
 	// await useUserInfo(pinia).setUserInfos();

+ 1 - 1
admin-web/src/router/index.ts

@@ -115,7 +115,7 @@ router.beforeEach(async (to, from, next) => {
     console.log("route>>>:", from.path,to.path)
     NProgress.configure({showSpinner: true});
     if (to.meta.title) NProgress.start();
-    const token = Session.get('token');
+    const token = Session.get('accessToken');
     // console.error(token)
     if (to.path === '/login' && !token) {
         next();

+ 2 - 2
admin-web/src/utils/request.ts

@@ -27,8 +27,8 @@ const service: AxiosInstance = axios.create({
 service.interceptors.request.use(
     (config) => {
         // 在发送请求之前做些什么 token
-        if (Session.get('token')) {
-            config.headers!['satoken'] = `${Session.get('token')}`;
+        if (Session.get('accessToken')) {
+            config.headers!['accessToken'] = `${Session.get('accessToken')}`;
         }
         return config;
     },

+ 4 - 4
admin-web/src/utils/storage.ts

@@ -42,23 +42,23 @@ export const Local = {
 export const Session = {
 	// 设置临时缓存
 	set<T>(key: string, val: T) {
-		if (key === 'token') return Cookies.set(key, val);
+		if (key === 'accessToken') return Cookies.set(key, val);
 		window.sessionStorage.setItem(Local.setKey(key), JSON.stringify(val));
 	},
 	// 获取临时缓存
 	get(key: string) {
-		if (key === 'token') return Cookies.get(key);
+		if (key === 'accessToken') return Cookies.get(key);
 		let json = <string>window.sessionStorage.getItem(Local.setKey(key));
 		return JSON.parse(json);
 	},
 	// 移除临时缓存
 	remove(key: string) {
-		if (key === 'token') return Cookies.remove(key);
+		if (key === 'accessToken') return Cookies.remove(key);
 		window.sessionStorage.removeItem(Local.setKey(key));
 	},
 	// 移除全部临时缓存
 	clear() {
-		Cookies.remove('token');
+		Cookies.remove('accessToken');
 		window.sessionStorage.clear();
 	},
 };

+ 3 - 3
admin-web/src/utils/u.ts

@@ -508,7 +508,7 @@ const u = {
             return ( money/100).toFixed(2);
         },
         fmtUrl: function (v: string) {
-            let token = Session.get('token')
+            let token = Session.get('accessToken')
             if(!v){
                 return '';
             }
@@ -520,7 +520,7 @@ const u = {
             return `${fileUrl}${v}`
         },
         fmtImg(v: string) {
-            let token = Session.get('token')
+            let token = Session.get('accessToken')
             if (u.isEmptyOrNull(v)) {
                 return "./image/placeholder.png";
             }
@@ -530,7 +530,7 @@ const u = {
             return `${fileUrl}${v}`
         },
         fmtPreview(v: string) {
-            let token = Session.get('token')
+            let token = Session.get('accessToken')
             if (u.isEmptyOrNull(v)) {
                 return "./image/placeholder.png";
             }

+ 6 - 5
admin-web/src/views/admin/station/endpoint/upload.vue

@@ -164,12 +164,13 @@ const initState = () => ({
   importLoading: false,
   tableHeight: 400,
   fieldList:[
+    {label:'序号ID',value:'id'},
+    {label:'站点ID',value:'stationId'},
     {label:'站点名称',value:'stationName'},
-    {label:'充电桩编号',value:'shortId'},
+    {label:'设备短编号',value:'shortId'},
+    {label:'充电桩SN',value:'equipmentId'},
+    {label:'充电口SN',value:'connectorId'},
     {label:'车位编号',value:'parkingNo'},
-    {label:'充电桩序列号',value:'equipmentId'},
-    {label:'充电桩接口编号',value:'connectorId'},
-    {label:'状态',value:'status'},
   ]
 })
 
@@ -270,7 +271,7 @@ let  fields=state.excelForm.importFields.filter(k => !!k);
     dataList
   }
 
-  $body(`connector/importData`, params).then(() => {
+  $body(`station/importData`, params).then(() => {
     Msg.message(`导入成功`)
     state.importLoading = false;
     emit('on-import-finish')

+ 3 - 3
admin-web/src/views/login/component/account.vue

@@ -156,11 +156,11 @@ const onSignIn = async () => {
     password:encryptData(state.ruleForm.pwd)
   }
   $body(`/admin-user/login`, temp).then((res: any) => {
-    let {id,satoken} = res;
+    let {id,accessToken} = res;
     console.log(res)
-    if (satoken) {
+    if (accessToken) {
       // 存储 token 到浏览器缓存
-      Session.set('token', satoken);
+      Session.set('accessToken', accessToken);
       Cookies.set('userId', id);
 
       initData();

+ 1 - 1
admin/src/main/java/com/kym/admin/config/SaTokenConfigure.java

@@ -25,7 +25,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
                         "/finance/export/*",
                         "/**/login",
                         "/**/error",
-                        "/**/pullEnStations",
+                        "/**/pullEnStations/*",
                         "/**/*.html",
                         "/**/*.js",
                         "/**/*.css",

+ 10 - 3
admin/src/main/java/com/kym/admin/controller/StationController.java

@@ -1,6 +1,7 @@
 package com.kym.admin.controller;
 
 import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.kym.common.R;
 import com.kym.common.annotation.SysLog;
 import com.kym.entity.admin.Station;
@@ -68,9 +69,9 @@ public class StationController {
      *
      * @return
      */
-    @GetMapping("/pullEnStations")
-    R<?> pullEnStationInfos() {
-        stationService.pullEnStationInfos();
+    @GetMapping("/pullEnStations/{stationId}")
+    R<?> pullEnStationInfos(@PathVariable String stationId) {
+        stationService.pullEnStationInfos(stationId);
         return R.success();
     }
 
@@ -82,4 +83,10 @@ public class StationController {
         return R.success();
     }
 
+    @PostMapping("/importData")
+    R<?> importData(@RequestBody JSONObject data){
+        stationService.importData(data);
+        return R.success(data);
+    }
+
 }

+ 1 - 1
admin/src/main/resources/application-dev.yml

@@ -95,7 +95,7 @@ spring:
       port: 6380
       host: 121.40.98.15
       password: KtXA^Zx!TZmLEy(@JjB@2(TVG0kdy5)&
-      database: 0
+      database: 10
       lettuce:
         pool:
           min-idle: 1

+ 2 - 2
admin/src/main/resources/application-prod.yml

@@ -93,9 +93,9 @@ spring:
   data:
     redis:
       port: 6379
-      host: 127.0.0.1
+      host: 121.40.98.15
       password: OPYCJ3mJpaU4IsP7ZeIyaus6FtHjLYmhNDGteuRc1gIFCAm7wi
-      database: 0
+      database: 10
       lettuce:
         pool:
           min-idle: 1

+ 2 - 2
admin/src/main/resources/application.yml

@@ -23,9 +23,9 @@ mybatis-plus:
 
 sa-token:
   # jwt秘钥
-  jwt-secret-key: 12345678
+  jwt-secret-key: kym-admin
   # token 名称(同时也是 cookie 名称)
-  token-name: satoken
+  token-name: accessToken
   # token 有效期(单位:秒) 默认30分钟,-1 代表永久有效
   timeout: -1
   # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结

+ 2 - 2
common/pom.xml

@@ -67,13 +67,13 @@
         <dependency>
             <groupId>cn.dev33</groupId>
             <artifactId>sa-token-spring-boot3-starter</artifactId>
-            <version>1.35.0.RC</version>
+            <version>1.38.0</version>
         </dependency>
         <!-- sa-token 集成redis-->
         <dependency>
             <groupId>cn.dev33</groupId>
             <artifactId>sa-token-redis-jackson</artifactId>
-            <version>1.35.0.RC</version>
+            <version>1.38.0</version>
         </dependency>
 
         <dependency>

+ 1 - 1
common/src/main/java/com/kym/common/handler/GlobalExceptionHandler.java

@@ -72,7 +72,7 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(value = NotLoginException.class)
     @ResponseBody
-    public R handleLoginException(NotLoginException e) {
+    public R<?> handleLoginException(NotLoginException e) {
 
         var message = "";
         if (e.getType().equals(NotLoginException.NOT_TOKEN)) {

+ 14 - 19
entity/src/main/java/com/kym/entity/admin/EquipmentRelation.java

@@ -1,9 +1,9 @@
 package com.kym.entity.admin;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kym.entity.BaseEntity;
-import lombok.Getter;
+import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 
@@ -15,7 +15,8 @@ import java.io.Serializable;
  * @author skyline
  * @since 2023-08-07
  */
-@Getter
+@Data
+@Accessors(chain = true)
 @TableName("t_equipment_relation")
 public class EquipmentRelation extends BaseEntity implements Serializable {
 
@@ -26,6 +27,11 @@ public class EquipmentRelation extends BaseEntity implements Serializable {
      */
     private String stationId;
 
+    /**
+     * 站点名称
+     */
+    private String stationName;
+
     /**
      * 二维码sn号
      */
@@ -38,28 +44,17 @@ public class EquipmentRelation extends BaseEntity implements Serializable {
     /**
      * 充电枪口编号
      */
-    @TableField(exist = false)
     private String connectorId;
 
+    /**
+     * 停车位编号
+     */
+    private String parkingNo;
+
     /**
      * 状态 0:启用,1:未启用
      */
     private Integer status;
 
-    public void setStationId(String stationId) {
-        this.stationId = stationId;
-    }
-
-    public void setShortId(String shortId) {
-        this.shortId = shortId;
-    }
-
-    public void setEquipmentId(String equipmentId) {
-        this.equipmentId = equipmentId;
-        this.connectorId = equipmentId.concat("1");
-    }
 
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
 }

+ 2 - 0
entity/src/main/java/com/kym/entity/admin/Station.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.kym.entity.BaseEntity;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 
@@ -23,6 +24,7 @@ import java.io.Serializable;
 @Getter
 @Setter
 @TableName("t_station")
+@Accessors(chain = true)
 public class Station extends BaseEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;

+ 6 - 0
entity/src/main/java/com/kym/entity/admin/queryParams/CommonQueryParam.java

@@ -2,6 +2,7 @@ package com.kym.entity.admin.queryParams;
 
 import com.kym.entity.common.PageParams;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * @author skyline
@@ -9,11 +10,16 @@ import lombok.Data;
  * @date 2023-08-22 18:56
  */
 @Data
+@Accessors(chain = true)
 public class CommonQueryParam extends PageParams {
     /**
      * id
      */
     private Long id;
+    /**
+     * 用户id
+     */
+    private Long userId;
     /**
      * 手机号
      */

+ 4 - 1
mapper/src/main/resources/mappers/admin/EquipmentRelationMapper.xml

@@ -6,8 +6,11 @@
     <resultMap id="BaseResultMap" type="com.kym.entity.admin.EquipmentRelation">
         <id column="id" property="id" />
         <result column="station_id" property="stationId" />
+        <result column="station_name" property="stationName" />
         <result column="short_id" property="shortId" />
         <result column="equipment_id" property="equipmentId" />
+        <result column="connector_id" property="connectorId" />
+        <result column="parking_no" property="parkingNo" />
         <result column="status" property="status" />
         <result column="create_time" property="createTime" />
         <result column="update_time" property="updateTime" />
@@ -15,7 +18,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, station_id, short_id, equipment_id, status, create_time, update_time
+        id, station_id, station_name,short_id, equipment_id,connector_id, parking_no,status, create_time, update_time
     </sql>
 
 </mapper>

+ 1 - 1
miniapp/src/main/java/com/kym/miniapp/config/SaTokenConfigure.java

@@ -23,7 +23,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
                         "/error",
                         "/user/wxLogin",
                         "/user/refresh",
-                        "/charge/pullEnStations",
+                        "/charge/pullEnStations/*",
                         "/charge/notification_stationStatus",
                         "/charge/notification_start_charge_result",
                         "/charge/notification_start_charge_status",

+ 12 - 5
miniapp/src/main/java/com/kym/miniapp/controller/AccountController.java

@@ -1,11 +1,10 @@
 package com.kym.miniapp.controller;
 
 import com.kym.common.R;
+import com.kym.entity.admin.queryParams.CommonQueryParam;
+import com.kym.service.miniapp.RefundLogService;
 import com.kym.service.miniapp.WalletDetailService;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * <p>
@@ -21,8 +20,11 @@ public class AccountController {
 
     private final WalletDetailService walletDetailService;
 
-    public AccountController(WalletDetailService walletDetailService) {
+    private final RefundLogService refundLogService;
+
+    public AccountController(WalletDetailService walletDetailService, RefundLogService refundLogService) {
         this.walletDetailService = walletDetailService;
+        this.refundLogService = refundLogService;
     }
 
     /**
@@ -36,4 +38,9 @@ public class AccountController {
         return R.success(walletDetailService.listWalletDetail(type));
     }
 
+    @PostMapping("/listRefund")
+    public R<?> listRefund(@RequestBody CommonQueryParam params) {
+        return R.success(refundLogService.listRefundLogForApp(params));
+    }
+
 }

+ 3 - 3
miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -258,9 +258,9 @@ public class ChargerController {
      *
      * @return
      */
-    @GetMapping("/pullEnStations")
-    R<?> pullEnStationInfos() {
-        stationService.pullEnStationInfos();
+    @GetMapping("/pullEnStations/{stationId}")
+    R<?> pullEnStationInfos(@PathVariable String stationId) {
+        stationService.pullEnStationInfos(stationId);
         return R.success();
     }
 

+ 2 - 1
miniapp/src/main/java/com/kym/miniapp/utils/MybatisPlusGeneratorForMiniApp.java

@@ -16,7 +16,7 @@ public class MybatisPlusGeneratorForMiniApp {
 
     public static void main(String[] args) {
         // 指定数据源
-        FastAutoGenerator.create("jdbc:mysql://121.40.98.15:3307/charge_app", "kym", "kx7#zFvS$$%uVDkZPk")
+        FastAutoGenerator.create("jdbc:mysql://121.40.98.15:3307/charge_app", "root", "KuaiyuMan/*-")
                 .globalConfig(builder -> {
                     builder.author("skyline")
                             // 指定输出目录
@@ -55,6 +55,7 @@ public class MybatisPlusGeneratorForMiniApp {
 //                                    "t_cars",
 //                                    "t_collect",
 //                            "t_pay_log"
+//                            "t_user_coupon"
                             )
                             // 设置过滤表前缀
                             .addTablePrefix("t_");

+ 19 - 0
service/src/main/java/com/kym/service/MyBaseService.java

@@ -0,0 +1,19 @@
+package com.kym.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.yulichang.base.MPJBaseService;
+
+import java.util.Collection;
+import java.util.function.Function;
+
+
+/**
+ * 扩展mybatis-plus 实现指定字段更新
+ *
+ * @param <T>
+ */
+public interface MyBaseService<T> extends MPJBaseService<T> {
+    public boolean updateBatchByQueryWrapper(Collection<T> entityList, Function<T, QueryWrapper<T>> queryWrapperFunction);
+
+    public boolean updateByQueryWrapper(T entity, Function<T, QueryWrapper<T>> queryWrapperFunction);
+}

+ 32 - 0
service/src/main/java/com/kym/service/MyBaseServiceImpl.java

@@ -0,0 +1,32 @@
+package com.kym.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.enums.SqlMethod;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.github.yulichang.base.MPJBaseService;
+import org.apache.ibatis.binding.MapperMethod;
+
+import java.util.Collection;
+import java.util.function.Function;
+
+public class MyBaseServiceImpl<M extends MPJBaseMapper<T>, T> extends ServiceImpl<M, T> implements MPJBaseService<T>, MyBaseService<T> {
+
+    @Override
+    public boolean updateBatchByQueryWrapper(Collection<T> entityList, Function<T, QueryWrapper<T>> queryWrapperFunction) {
+        String sqlStatement = this.getSqlStatement(SqlMethod.UPDATE);
+        return this.executeBatch(entityList, DEFAULT_BATCH_SIZE, (sqlSession, entity) -> {
+            MapperMethod.ParamMap param = new MapperMethod.ParamMap();
+            param.put(Constants.ENTITY, entity);
+            param.put(Constants.WRAPPER, queryWrapperFunction.apply(entity));
+            sqlSession.update(sqlStatement, param);
+        });
+    }
+
+    @Override
+    public boolean updateByQueryWrapper(T entity, Function<T, QueryWrapper<T>> queryWrapperFunction) {
+        return SqlHelper.retBool(getBaseMapper().update(entity, queryWrapperFunction.apply(entity)));
+    }
+}

+ 3 - 2
service/src/main/java/com/kym/service/admin/ConnectorInfoService.java

@@ -1,10 +1,10 @@
 package com.kym.service.admin;
 
-import com.github.yulichang.base.MPJBaseService;
 import com.kym.entity.admin.ConnectorInfo;
 import com.kym.entity.admin.queryParams.EquipmentQueryParam;
 import com.kym.entity.admin.vo.ConnectorInfoVo;
 import com.kym.entity.common.PageBean;
+import com.kym.service.MyBaseService;
 
 import java.util.Map;
 
@@ -16,8 +16,9 @@ import java.util.Map;
  * @author skyline
  * @since 2023-08-05
  */
-public interface ConnectorInfoService extends MPJBaseService<ConnectorInfo> {
+public interface ConnectorInfoService extends MyBaseService<ConnectorInfo> {
     PageBean<ConnectorInfoVo> listConnectors(EquipmentQueryParam params);
 
     Map<Integer, Long> statConnectorStatus(String stationId);
+
 }

+ 2 - 4
service/src/main/java/com/kym/service/admin/EquipmentInfoService.java

@@ -1,9 +1,7 @@
 package com.kym.service.admin;
 
-import com.github.yulichang.base.MPJBaseService;
 import com.kym.entity.admin.EquipmentInfo;
-
-import java.util.Map;
+import com.kym.service.MyBaseService;
 
 /**
  * <p>
@@ -13,6 +11,6 @@ import java.util.Map;
  * @author skyline
  * @since 2023-09-01
  */
-public interface EquipmentInfoService extends MPJBaseService<EquipmentInfo> {
+public interface EquipmentInfoService extends MyBaseService<EquipmentInfo> {
 
 }

+ 6 - 1
service/src/main/java/com/kym/service/admin/StationService.java

@@ -1,5 +1,6 @@
 package com.kym.service.admin;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.github.yulichang.base.MPJBaseService;
 import com.kym.entity.admin.Station;
@@ -9,6 +10,7 @@ import com.kym.entity.enplus.EnStationStatsInfo;
 import com.kym.entity.enplus.EnStationStatusInfo;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -27,10 +29,13 @@ public interface StationService extends MPJBaseService<Station> {
 
     public EnStationStatsInfo stationStats(String stationId, String startTime, String endTime);
 
+    public void pullEnStationInfos(String stationId);
+
     @Transactional(rollbackFor = Exception.class)
-    public void pullEnStationInfos();
 
     void modifyStation(Station station);
 
     void addStation(List<ConnectorVo> connectorVos);
+
+    void importData(JSONObject data);
 }

+ 1 - 1
service/src/main/java/com/kym/service/admin/impl/AdminUserServiceImpl.java

@@ -81,7 +81,7 @@ public class AdminUserServiceImpl extends MPJBaseServiceImpl<AdminUserMapper, Ad
             this.updateById(user);
             LOGGER.info("操作员:" + mobilePhone + "/id:" + user.getId() + "登录");
             // token在cookie中有隐式返回,这里多做显式返回
-            return R.success(Map.of("id", user.getId(), "satoken", StpUtil.getTokenValue()));
+            return R.success(Map.of("id", user.getId(), "accessToken", StpUtil.getTokenValue()));
         }
         return R.failed(ResponseEnum.LOGIN_FAILED);
     }

+ 8 - 3
service/src/main/java/com/kym/service/admin/impl/ConnectorInfoServiceImpl.java

@@ -4,7 +4,6 @@ import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.github.pagehelper.PageHelper;
-import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.kym.common.utils.CommUtil;
 import com.kym.entity.admin.ConnectorInfo;
 import com.kym.entity.admin.EquipmentInfo;
@@ -13,7 +12,9 @@ import com.kym.entity.admin.vo.ConnectorInfoVo;
 import com.kym.entity.common.PageBean;
 import com.kym.entity.miniapp.ChargeOrder;
 import com.kym.mapper.admin.ConnectorInfoMapper;
+import com.kym.service.MyBaseServiceImpl;
 import com.kym.service.admin.ConnectorInfoService;
+import com.kym.service.admin.EquipmentRelationService;
 import com.kym.service.cache.KymCache;
 import com.kym.service.miniapp.ChargeOrderService;
 import org.springframework.beans.BeanUtils;
@@ -36,12 +37,15 @@ import static com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isNotNull;
  */
 @Service
 @DS("db-admin")
-public class ConnectorInfoServiceImpl extends MPJBaseServiceImpl<ConnectorInfoMapper, ConnectorInfo> implements ConnectorInfoService {
+public class ConnectorInfoServiceImpl extends MyBaseServiceImpl<ConnectorInfoMapper, ConnectorInfo> implements ConnectorInfoService {
 
     private final ChargeOrderService chargeOrderService;
 
-    public ConnectorInfoServiceImpl(ChargeOrderService chargeOrderService) {
+    private final EquipmentRelationService equipmentRelationService;
+
+    public ConnectorInfoServiceImpl(ChargeOrderService chargeOrderService, EquipmentRelationService equipmentRelationService) {
         this.chargeOrderService = chargeOrderService;
+        this.equipmentRelationService = equipmentRelationService;
     }
 
     @Override
@@ -104,4 +108,5 @@ public class ConnectorInfoServiceImpl extends MPJBaseServiceImpl<ConnectorInfoMa
         res.put(EquipmentInfo.SERVICE_STATUS_预约中, orderInfos);
         return res;
     }
+
 }

+ 2 - 2
service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java

@@ -2,9 +2,9 @@ package com.kym.service.admin.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
-import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.kym.entity.admin.EquipmentInfo;
 import com.kym.mapper.admin.EquipmentInfoMapper;
+import com.kym.service.MyBaseServiceImpl;
 import com.kym.service.admin.EquipmentInfoService;
 import com.kym.service.cache.KymCache;
 import jakarta.annotation.PostConstruct;
@@ -22,7 +22,7 @@ import java.util.stream.Collectors;
  */
 @Service
 @DS("db-admin")
-public class EquipmentInfoServiceImpl extends MPJBaseServiceImpl<EquipmentInfoMapper, EquipmentInfo> implements EquipmentInfoService {
+public class EquipmentInfoServiceImpl extends MyBaseServiceImpl<EquipmentInfoMapper, EquipmentInfo> implements EquipmentInfoService {
 
     @PostConstruct
     private void init() {

+ 4 - 5
service/src/main/java/com/kym/service/admin/impl/InvoiceDetailServiceImpl.java

@@ -1,18 +1,15 @@
 package com.kym.service.admin.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
 import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.kym.common.utils.CommUtil;
 import com.kym.entity.admin.InvoiceDetail;
 import com.kym.entity.admin.queryParams.InvoiceDetailQueryParam;
 import com.kym.entity.common.PageBean;
-import com.kym.entity.miniapp.DataDict;
 import com.kym.entity.miniapp.Invoice;
 import com.kym.entity.wechat.FapiaoApplications;
 import com.kym.mapper.admin.InvoiceDetailMapper;
@@ -20,8 +17,10 @@ import com.kym.service.admin.InvoiceDetailService;
 import com.kym.service.miniapp.DataDictService;
 import org.springframework.stereotype.Service;
 
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>

+ 91 - 51
service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java

@@ -1,11 +1,13 @@
 package com.kym.service.admin.impl;
 
+import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
-import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.kym.common.annotation.DynamicCache;
 import com.kym.common.enums.EnPlusApi;
+import com.kym.common.exception.BusinessException;
 import com.kym.common.utils.AESUtil;
 import com.kym.common.utils.CommUtil;
 import com.kym.entity.admin.*;
@@ -15,19 +17,18 @@ import com.kym.entity.enplus.EnEquipmentInfo;
 import com.kym.entity.enplus.EnStationStatsInfo;
 import com.kym.entity.enplus.EnStationStatusInfo;
 import com.kym.mapper.admin.StationMapper;
+import com.kym.service.MyBaseServiceImpl;
 import com.kym.service.admin.*;
 import com.kym.service.cache.KymCache;
 import com.kym.service.enplus.EnPlusService;
 import jakarta.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -40,7 +41,8 @@ import java.util.stream.Collectors;
  */
 @Service
 @DS("db-admin")
-public class StationServiceImpl extends MPJBaseServiceImpl<StationMapper, Station> implements StationService {
+@Slf4j
+public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station> implements StationService {
 
     private final EnPlusService enPlusService;
     private final EquipmentInfoService equipmentInfoService;
@@ -156,60 +158,60 @@ public class StationServiceImpl extends MPJBaseServiceImpl<StationMapper, Statio
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void pullEnStationInfos() {
-        var stationVoList = queryStationInfo(1, 1000);
-        var stationList = new ArrayList<Station>();
+    public void pullEnStationInfos(String stationId) {
+        // 指定的站点信息
+        var stationVo = queryStationInfo(1, 1000).stream().filter(vo -> stationId.equals(vo.getStationId())).findFirst().orElse(null);
+
+        var station = new Station();
         var equipmentList = new ArrayList<EquipmentInfo>();
         var connectorList = new ArrayList<ConnectorInfo>();
-        stationVoList.forEach(vo -> {
-            if (!vo.getEquipmentInfos().isEmpty()) {
-                vo.getEquipmentInfos().forEach(item -> {
-                    // 桩体
-                    var equipment = new EquipmentInfo()
-                            .setStationId(vo.getStationId())
-                            .setShortId(item.getShortId())
-                            .setPower(item.getConnectorInfos().get(0).getPower());
-                    BeanUtils.copyProperties(item, equipment);
-                    equipmentList.add(equipment);
-                    // 枪
-                    var connectorInfos = item.getConnectorInfos();
-                    if (!CommUtil.isEmptyOrNull(connectorInfos)) {
-                        connectorInfos.forEach(connector -> {
-                            var connectorInfo = new ConnectorInfo();
-                            BeanUtils.copyProperties(connector, connectorInfo);
-                            connectorList.add(connectorInfo);
-                        });
-                    }
-                });
-                equipmentList.sort(Comparator.comparing(EquipmentInfo::getShortId));
-            }
-            var station = new Station();
-            BeanUtils.copyProperties(vo, station);
-            stationList.add(station);
-        });
-        // 查询已存在的站点,只更新新增的站点和设备
-        var stations = list().stream().map(Station::getStationId).toList();
-        var equipments = equipmentInfoService.list().stream().map(EquipmentInfo::getEquipmentId).toList();
-        var connectors = connectorInfoService.list().stream().map(ConnectorInfo::getConnectorId).toList();
 
-        // 新增的数据
-        var newStations = stationList.stream().filter(station -> !stations.contains(station.getStationId())).toList();
-        var newEquipmentInfos = equipmentList.stream().filter(equipmentInfo -> !equipments.contains(equipmentInfo.getEquipmentId())).toList();
-        var newConnectors = connectorList.stream().filter(connector -> !connectors.contains(connector.getConnectorId())).toList();
+        // 组装数据
+        assert stationVo != null;
+        if (!stationVo.getEquipmentInfos().isEmpty()) {
+            stationVo.getEquipmentInfos().forEach(item -> {
+                // 桩体
+                var equipment = new EquipmentInfo()
+                        .setStationId(stationVo.getStationId())
+                        .setShortId(item.getShortId())
+                        .setPower(item.getConnectorInfos().get(0).getPower());
+                BeanUtils.copyProperties(item, equipment);
+                equipmentList.add(equipment);
+                // 枪
+                var connectorInfos = item.getConnectorInfos();
+                if (!CommUtil.isEmptyOrNull(connectorInfos)) {
+                    connectorInfos.forEach(connector -> {
+                        var connectorInfo = new ConnectorInfo();
+                        BeanUtils.copyProperties(connector, connectorInfo);
+                        connectorList.add(connectorInfo);
+                    });
+                }
+            });
+            equipmentList.sort(Comparator.comparing(EquipmentInfo::getShortId));
+        }
+        BeanUtils.copyProperties(stationVo, station);
 
-        // 将充电站相关数据写入KymCache
-        // 手动切换数据源
         DynamicDataSourceContextHolder.push("db-admin");
-        KymCache.INSTANCE.putStationId2Name(newStations.stream().collect(Collectors.toMap(Station::getStationId, Station::getStationName)));
-//        KymCache.INSTANCE.putConnectorId2ParkingNo(newEquipmentInfos.stream().collect(Collectors.toMap(equipmentInfo -> equipmentInfo.getEquipmentId().concat("1"), EquipmentInfo::getParkingNo?)));
+        // 更新站点信息
+        updateByQueryWrapper(station, s -> new QueryWrapper<Station>().eq("station_id", station.getStationId()));
+
+        // 更新设备信息
+        equipmentInfoService.updateBatchByQueryWrapper(equipmentList, equipmentInfo ->
+                new QueryWrapper<EquipmentInfo>().eq("equipment_id", equipmentInfo.getEquipmentId()));
+
+        // 更新枪信息
+        connectorInfoService.updateBatchByQueryWrapper(connectorList, connectorInfo ->
+                new QueryWrapper<ConnectorInfo>().eq("connector_id", connectorInfo.getConnectorId()));
+
         DynamicDataSourceContextHolder.poll();
 
-        // 新数据写入数据库
-        saveBatch(newStations);
-        equipmentInfoService.saveBatch(newEquipmentInfos);
-        connectorInfoService.saveBatch(newConnectors);
+        // 将充电站相关数据写入KymCache
+        KymCache.INSTANCE.putStationId2Name(Map.of(stationVo.getStationId(), stationVo.getStationName()));
+
+
     }
 
+
     @Override
     @Transactional
     public void modifyStation(Station station) {
@@ -250,4 +252,42 @@ public class StationServiceImpl extends MPJBaseServiceImpl<StationMapper, Statio
         // TODO redis发布订阅?
     }
 
+    @Override
+    @Transactional
+    public void importData(JSONObject data) {
+        log.debug("导入数据:{}", data.toString());
+        var fieldIndexes = data.getJSONArray("fieldIndexes");
+        if (fieldIndexes.size() != 7) {
+            throw new BusinessException("导入数据格式错误,请正确匹配对应数据列");
+        }
+
+        String dataList = data.getString("dataList");
+        var list = JSON.parseArray(dataList, EquipmentRelation.class);
+
+        // t_station
+        var stations = list.stream().filter(CommUtil.distinctByKey(EquipmentRelation::getStationId))
+                .map(item -> Map.of("stationId", item.getStationId(), "stationName", item.getStationName())).toList();
+        var stationList = stations.stream().map(map -> new Station().setStationId(map.get("stationId")).setStationName(map.get("stationName"))).toList();
+        saveBatch(stationList);
+
+        // t_equipment_info
+        var equipmentInfoList = list.stream().map(item -> {
+            var equipmentInfo = new EquipmentInfo();
+            BeanUtils.copyProperties(item, equipmentInfo, "id");
+            return equipmentInfo;
+        }).toList();
+        equipmentInfoService.saveBatch(equipmentInfoList);
+
+        // t_connector_info
+        var connectorInfoList = list.stream().map(item -> {
+            var connectorInfo = new ConnectorInfo();
+            BeanUtils.copyProperties(item, connectorInfo, "id");
+            return connectorInfo;
+        }).toList();
+        connectorInfoService.saveBatch(connectorInfoList);
+
+        // t_equipment_relation
+        equipmentRelationService.saveBatch(list);
+    }
+
 }

+ 4 - 0
service/src/main/java/com/kym/service/miniapp/RefundLogService.java

@@ -6,6 +6,8 @@ import com.kym.entity.common.PageBean;
 import com.kym.entity.miniapp.RefundLog;
 import com.kym.entity.miniapp.vo.RefundVo;
 
+import java.util.List;
+
 /**
  * <p>
  * 退款日志 服务类
@@ -16,4 +18,6 @@ import com.kym.entity.miniapp.vo.RefundVo;
  */
 public interface RefundLogService extends MPJBaseService<RefundLog> {
     PageBean<RefundVo> listRefundLog(CommonQueryParam params);
+
+    PageBean<RefundLog> listRefundLogForApp(CommonQueryParam params);
 }

+ 7 - 0
service/src/main/java/com/kym/service/miniapp/impl/RefundLogServiceImpl.java

@@ -29,4 +29,11 @@ public class RefundLogServiceImpl extends MPJBaseServiceImpl<RefundLogMapper, Re
         var list = baseMapper.listRefundLog(params);
         return new PageBean<>(list);
     }
+
+    @Override
+    public PageBean<RefundLog> listRefundLogForApp(CommonQueryParam params) {
+        PageHelper.startPage(params.getPageNum(), params.getPageSize());
+        var list = lambdaQuery().eq(RefundLog::getUserId, params.getUserId()).orderByDesc(RefundLog::getCreateTime).list();
+        return new PageBean<>(list);
+    }
 }

+ 3 - 0
service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -874,6 +874,7 @@ public class WxPayServiceImpl implements WxPayService {
      * @return
      */
     @Override
+    @Transactional
     public void wxInvoiceNotify(Object[] notifyRes) {
         try {
             InvoiceNotification invoiceNotification = ((NotificationParser) notifyRes[1]).parse((RequestParam) notifyRes[0], InvoiceNotification.class);
@@ -911,6 +912,7 @@ public class WxPayServiceImpl implements WxPayService {
                         .setBuyerInformation(fapiaoApplications.getFapiao_information().get(0).getBuyer_information())
                         .setExtraInformation(fapiaoApplications.getFapiao_information().get(0).getExtra_information())
                         .setItems(fapiaoApplications.getFapiao_information().get(0).getItems());
+                invoiceDetailService.removeByMap(Map.of("apply_id", invoice.getApplyId()));
                 invoiceDetailService.save(invoiceDetail);
 
             } else {
@@ -1009,6 +1011,7 @@ public class WxPayServiceImpl implements WxPayService {
                 .setBuyerInformation(fapiaoApplications.getFapiao_information().get(0).getBuyer_information())
                 .setExtraInformation(fapiaoApplications.getFapiao_information().get(0).getExtra_information())
                 .setItems(fapiaoApplications.getFapiao_information().get(0).getItems());
+        invoiceDetailService.removeByMap(Map.of("apply_id", applyId));
         invoiceDetailService.save(invoiceDetail);