From f27c9cc23c0741367f323d10fbbe3ec609bf55e4 Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Sat, 15 Feb 2025 17:39:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- pom.xml | 9 +- .../czg/mergedata/MergeDataApplication.java | 2 + .../mergedata/common/constants/Constants.java | 8 + .../common/exception/CzgControllerAdvice.java | 78 +++++ .../common/exception/CzgException.java | 31 ++ .../mergedata/common/resp/CzgRespCode.java | 30 ++ .../czg/mergedata/common/resp/CzgResult.java | 62 ++++ .../czg/mergedata/common/utils/CodeGen.java | 8 +- .../czg/mergedata/common/utils/PageUtils.java | 28 ++ .../mergedata/controller/UserController.java | 11 + .../cur/entity/CurShopIdRelation.java | 36 ++ .../cur/mapper/CurShopIdRelationMapper.java | 14 + .../cur/service/CurShopIdRelationService.java | 14 + .../cur/service/CurSysUserService.java | 2 + .../impl/CurShopIdRelationServiceImpl.java | 18 + ...oImpl.java => CurShopInfoServiceImpl.java} | 2 +- ...Impl.java => CurShopStaffServiceImpl.java} | 2 +- .../cur/service/impl/CurSysUserImpl.java | 18 - .../service/impl/CurSysUserServiceImpl.java | 307 ++++++++++++++++++ .../old/entity/OldMerchantAccount.java | 150 +++++++++ .../old/mapper/OldMerchantAccountMapper.java | 14 + .../service/OldMerchantAccountService.java | 14 + .../impl/OldMerchantAccountServiceImpl.java | 18 + ...java => OldPlussShopStaffServiceImpl.java} | 2 +- ...oImpl.java => OldShopInfoServiceImpl.java} | 2 +- ...erImpl.java => OldSysUserServiceImpl.java} | 2 +- src/main/resources/application-dev.yml | 4 +- src/main/resources/application.yml | 5 +- .../mapper/cur/ShopIdRelationMapper.xml | 7 + .../mapper/old/MerchantAccountMapper.xml | 7 + 收银机数据迁移关系.md | 17 + 32 files changed, 892 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/czg/mergedata/common/constants/Constants.java create mode 100644 src/main/java/com/czg/mergedata/common/exception/CzgControllerAdvice.java create mode 100644 src/main/java/com/czg/mergedata/common/exception/CzgException.java create mode 100644 src/main/java/com/czg/mergedata/common/resp/CzgRespCode.java create mode 100644 src/main/java/com/czg/mergedata/common/resp/CzgResult.java create mode 100644 src/main/java/com/czg/mergedata/common/utils/PageUtils.java create mode 100644 src/main/java/com/czg/mergedata/cur/entity/CurShopIdRelation.java create mode 100644 src/main/java/com/czg/mergedata/cur/mapper/CurShopIdRelationMapper.java create mode 100644 src/main/java/com/czg/mergedata/cur/service/CurShopIdRelationService.java create mode 100644 src/main/java/com/czg/mergedata/cur/service/impl/CurShopIdRelationServiceImpl.java rename src/main/java/com/czg/mergedata/cur/service/impl/{CurShopInfoImpl.java => CurShopInfoServiceImpl.java} (77%) rename src/main/java/com/czg/mergedata/cur/service/impl/{CurShopStaffImpl.java => CurShopStaffServiceImpl.java} (76%) delete mode 100644 src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserImpl.java create mode 100644 src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserServiceImpl.java create mode 100644 src/main/java/com/czg/mergedata/old/entity/OldMerchantAccount.java create mode 100644 src/main/java/com/czg/mergedata/old/mapper/OldMerchantAccountMapper.java create mode 100644 src/main/java/com/czg/mergedata/old/service/OldMerchantAccountService.java create mode 100644 src/main/java/com/czg/mergedata/old/service/impl/OldMerchantAccountServiceImpl.java rename src/main/java/com/czg/mergedata/old/service/impl/{OldPlussShopStaffImpl.java => OldPlussShopStaffServiceImpl.java} (74%) rename src/main/java/com/czg/mergedata/old/service/impl/{OldShopInfoImpl.java => OldShopInfoServiceImpl.java} (76%) rename src/main/java/com/czg/mergedata/old/service/impl/{OldSysUserImpl.java => OldSysUserServiceImpl.java} (77%) create mode 100644 src/main/resources/mapper/cur/ShopIdRelationMapper.xml create mode 100644 src/main/resources/mapper/old/MerchantAccountMapper.xml create mode 100644 收银机数据迁移关系.md diff --git a/.gitignore b/.gitignore index 779b04e..f2d67c3 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,4 @@ build/ ### VS Code ### .vscode/ -#/logs/ +/logs/ diff --git a/pom.xml b/pom.xml index d219267..1f0e136 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ org.projectlombok lombok - true + 1.18.36 org.springframework.boot @@ -78,6 +78,12 @@ HikariCP 4.0.3 + + + cn.hutool + hutool-all + 5.8.35 + @@ -90,6 +96,7 @@ org.projectlombok lombok + 1.18.36 diff --git a/src/main/java/com/czg/mergedata/MergeDataApplication.java b/src/main/java/com/czg/mergedata/MergeDataApplication.java index 5a5467b..f19398b 100644 --- a/src/main/java/com/czg/mergedata/MergeDataApplication.java +++ b/src/main/java/com/czg/mergedata/MergeDataApplication.java @@ -2,11 +2,13 @@ package com.czg.mergedata; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @author GY_Joker */ @SpringBootApplication +@EnableTransactionManagement public class MergeDataApplication { public static void main(String[] args) { diff --git a/src/main/java/com/czg/mergedata/common/constants/Constants.java b/src/main/java/com/czg/mergedata/common/constants/Constants.java new file mode 100644 index 0000000..678f523 --- /dev/null +++ b/src/main/java/com/czg/mergedata/common/constants/Constants.java @@ -0,0 +1,8 @@ +package com.czg.mergedata.common.constants; + +/** + * @author GYJoker + */ +public class Constants { + +} diff --git a/src/main/java/com/czg/mergedata/common/exception/CzgControllerAdvice.java b/src/main/java/com/czg/mergedata/common/exception/CzgControllerAdvice.java new file mode 100644 index 0000000..e185e8c --- /dev/null +++ b/src/main/java/com/czg/mergedata/common/exception/CzgControllerAdvice.java @@ -0,0 +1,78 @@ +package com.czg.mergedata.common.exception; + +import com.czg.mergedata.common.resp.CzgRespCode; +import com.czg.mergedata.common.resp.CzgResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author GYJoker + */ +@RestControllerAdvice +@Slf4j +public class CzgControllerAdvice { + @ResponseBody + @ExceptionHandler(value = Exception.class) + @ResponseStatus(HttpStatus.OK) + public CzgResult errorHandler(Exception ex) { + setErrorLog(ex); + log.error("", ex); + return CzgResult.failure(CzgRespCode.SYSTEM_ERROR); + } + + @ResponseBody + @ExceptionHandler(value = HttpMessageNotReadableException.class) + @ResponseStatus(HttpStatus.OK) + public CzgResult invalidFormatExceptionErrorHandler(HttpMessageNotReadableException ex) { + setErrorLog(ex); + return CzgResult.failure(ex.getRootCause() == null ? ex.getMessage() : ex.getRootCause().getMessage()); + } + + @ResponseBody + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.OK) + public CzgResult requestParamException(MethodArgumentNotValidException ex) { + setErrorLog(ex); + List allErrors = ex.getBindingResult().getAllErrors(); + String message = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";")); + return CzgResult.failure(CzgRespCode.PARAM_ERROR.getCode(), message); + } + + /** + * 处理自定义异常 + */ + @ExceptionHandler(CzgException.class) + public CzgResult handleCzgException(CzgException ex) { + return CzgResult.failure(ex.getCode(), ex.getMsg()); + } + + /** + * 处理Hutool的断言抛出异常 + */ + @ExceptionHandler(IllegalArgumentException.class) + public CzgResult handleAssertException(IllegalArgumentException ex) { + return CzgResult.failure(CzgRespCode.PARAM_ERROR.getCode(), ex.getMessage()); + } + + @ExceptionHandler(DuplicateKeyException.class) + public CzgResult handleDuplicateKeyException(DuplicateKeyException ex) { + setErrorLog(ex); + return CzgResult.failure(CzgRespCode.RECORD_EXISTED); + } + + private void setErrorLog(Exception ex) { + log.error(ex.getMessage()); + } +} diff --git a/src/main/java/com/czg/mergedata/common/exception/CzgException.java b/src/main/java/com/czg/mergedata/common/exception/CzgException.java new file mode 100644 index 0000000..3d3bf9c --- /dev/null +++ b/src/main/java/com/czg/mergedata/common/exception/CzgException.java @@ -0,0 +1,31 @@ +package com.czg.mergedata.common.exception; + +import com.czg.mergedata.common.resp.CzgRespCode; +import lombok.Getter; +import lombok.Setter; + +/** + * 自定义异常 + * + * @author admin admin@cashier.com + * @since 1.0.0 + */ +@Setter +@Getter +public class CzgException extends RuntimeException { + private int code; + private String msg; + + public CzgException(String msg) { + super(msg); + this.code = CzgRespCode.FAILURE.getCode(); + this.msg = msg; + } + + public CzgException(String msg, Throwable e) { + super(msg, e); + this.code = CzgRespCode.FAILURE.getCode(); + this.msg = msg; + } + +} diff --git a/src/main/java/com/czg/mergedata/common/resp/CzgRespCode.java b/src/main/java/com/czg/mergedata/common/resp/CzgRespCode.java new file mode 100644 index 0000000..60ae51b --- /dev/null +++ b/src/main/java/com/czg/mergedata/common/resp/CzgRespCode.java @@ -0,0 +1,30 @@ +package com.czg.mergedata.common.resp; + + +import lombok.Getter; + +/** + * @author GYJoker + */ +@Getter +public enum CzgRespCode { + SUCCESS(200, "操作成功"), + FAILURE(500, "操作失败"), + NOT_LOGIN(501, "登录失效"), + SYSTEM_ERROR(555, "系统内部错误"), + RECORD_NOT_EXIST(601, "记录不存在"), + RECORD_EXISTED(602, "记录已存在"), + PARAM_ERROR(603, "参数错误"), + UNAUTHORIZED(401, "未授权"), + UN_PERMISSION(402, "无此接口权限"), + UN_ROLE(403, "角色权限不足"); + + private final int code; + private final String msg; + + CzgRespCode(int code, String msg) { + this.code = code; + this.msg = msg; + } + +} diff --git a/src/main/java/com/czg/mergedata/common/resp/CzgResult.java b/src/main/java/com/czg/mergedata/common/resp/CzgResult.java new file mode 100644 index 0000000..952de65 --- /dev/null +++ b/src/main/java/com/czg/mergedata/common/resp/CzgResult.java @@ -0,0 +1,62 @@ +package com.czg.mergedata.common.resp; + +import lombok.Data; + +import java.io.Serializable; + +/** + * Result类用于封装请求响应的结果,包含状态码、消息和数据 + * @author GYJ + */ +@Data +public class CzgResult implements Serializable { + + private int code; + + private String msg; + + private T data; + + // 私有构造函数,用于在类内部创建实例,强制通过静态方法来获取Result对象 + private CzgResult(int code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + // 以下是三个静态方法,分别用于创建不同状态的Result对象 + + // 创建成功的响应结果对象,默认消息和无数据情况 + public static CzgResult success() { + return new CzgResult<>(200, "操作成功", null); + } + + // 创建成功的响应结果对象,携带指定的数据 + public static CzgResult success(T data) { + return new CzgResult<>(200, "操作成功", data); + } + + // 创建带有自定义消息的成功响应结果对象,携带指定的数据 + public static CzgResult success(String msg, T data) { + return new CzgResult<>(200, msg, data); + } + + // 创建失败的响应结果对象,默认消息和无数据情况 + public static CzgResult failure() { + return new CzgResult<>(500, "操作失败", null); + } + + // 创建失败的响应结果对象,携带指定的自定义消息 + public static CzgResult failure(String msg) { + return new CzgResult<>(500, msg, null); + } + + // 创建带有自定义状态码和消息的失败响应结果对象,无数据情况 + public static CzgResult failure(int code, String msg) { + return new CzgResult<>(code, msg, null); + } + + public static CzgResult failure(CzgRespCode respCode) { + return new CzgResult<>(respCode.getCode(), respCode.getMsg(), null); + } +} diff --git a/src/main/java/com/czg/mergedata/common/utils/CodeGen.java b/src/main/java/com/czg/mergedata/common/utils/CodeGen.java index 1d59413..238f944 100644 --- a/src/main/java/com/czg/mergedata/common/utils/CodeGen.java +++ b/src/main/java/com/czg/mergedata/common/utils/CodeGen.java @@ -18,8 +18,8 @@ public class CodeGen { private final static String DATABASE = "czg_cashier"; private final static String OLD_DATABASE = "fycashier_test"; - private final static boolean isOldVersion = false; -// private final static boolean isOldVersion = true; +// private final static boolean isOldVersion = false; + private final static boolean isOldVersion = true; public static void main(String[] args) { //配置数据源 @@ -57,7 +57,7 @@ public class CodeGen { ServiceImplConfig implConfig = globalConfig.getServiceImplConfig(); implConfig.setSuperClass(ServiceImpl.class); - implConfig.setClassSuffix("Impl"); + implConfig.setClassSuffix("ServiceImpl"); if (isOldVersion) { implConfig.setClassPrefix("Old"); } else { @@ -81,7 +81,7 @@ public class CodeGen { //设置表前缀和只生成哪些表,setGenerateTable 未配置时,生成所有表 globalConfig.getStrategyConfig() .setTablePrefix("tb_") - .setGenerateTable("tb_shop_staff"); + .setGenerateTable("tb_merchant_account"); EntityConfig entityConfig = globalConfig.getEntityConfig(); if (isOldVersion) { diff --git a/src/main/java/com/czg/mergedata/common/utils/PageUtils.java b/src/main/java/com/czg/mergedata/common/utils/PageUtils.java new file mode 100644 index 0000000..b89cf8c --- /dev/null +++ b/src/main/java/com/czg/mergedata/common/utils/PageUtils.java @@ -0,0 +1,28 @@ +package com.czg.mergedata.common.utils; + +import com.mybatisflex.core.paginate.Page; + +/** + * @author GYJoker + */ +public class PageUtils { + public static final Long PAGE_SIZE = 100L; + + public static Page buildPage() { + return buildPage(1L); + } + + public static Page buildPage(Long page) { + return buildPage(page, PAGE_SIZE); + } + + public static Page buildPage(Long page, Long size) { + if (page == null || page <= 0) { + page = 1L; + } + if (size == null || size <= 0) { + size = PAGE_SIZE; + } + return new Page<>(page, size); + } +} diff --git a/src/main/java/com/czg/mergedata/controller/UserController.java b/src/main/java/com/czg/mergedata/controller/UserController.java index a6ce82e..edaafc5 100644 --- a/src/main/java/com/czg/mergedata/controller/UserController.java +++ b/src/main/java/com/czg/mergedata/controller/UserController.java @@ -1,5 +1,8 @@ package com.czg.mergedata.controller; +import com.czg.mergedata.common.resp.CzgResult; +import com.czg.mergedata.cur.service.CurSysUserService; +import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,4 +12,12 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") public class UserController { + + @Resource + private CurSysUserService curSysUserService; + + @RequestMapping("/mergeShopInfo") + public CzgResult mergeShopInfo() { + return curSysUserService.mergeShopInfo(); + } } diff --git a/src/main/java/com/czg/mergedata/cur/entity/CurShopIdRelation.java b/src/main/java/com/czg/mergedata/cur/entity/CurShopIdRelation.java new file mode 100644 index 0000000..51fe191 --- /dev/null +++ b/src/main/java/com/czg/mergedata/cur/entity/CurShopIdRelation.java @@ -0,0 +1,36 @@ +package com.czg.mergedata.cur.entity; + +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; + +import java.io.Serial; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 实体类。 + * + * @author mac + * @since 2025-02-15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("shop_id_relation") +public class CurShopIdRelation implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id + private Long curShopId; + + @Id + private Long oldShopId; + +} diff --git a/src/main/java/com/czg/mergedata/cur/mapper/CurShopIdRelationMapper.java b/src/main/java/com/czg/mergedata/cur/mapper/CurShopIdRelationMapper.java new file mode 100644 index 0000000..4b09495 --- /dev/null +++ b/src/main/java/com/czg/mergedata/cur/mapper/CurShopIdRelationMapper.java @@ -0,0 +1,14 @@ +package com.czg.mergedata.cur.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.mergedata.cur.entity.CurShopIdRelation; + +/** + * 映射层。 + * + * @author mac + * @since 2025-02-15 + */ +public interface CurShopIdRelationMapper extends BaseMapper { + +} diff --git a/src/main/java/com/czg/mergedata/cur/service/CurShopIdRelationService.java b/src/main/java/com/czg/mergedata/cur/service/CurShopIdRelationService.java new file mode 100644 index 0000000..4ac675a --- /dev/null +++ b/src/main/java/com/czg/mergedata/cur/service/CurShopIdRelationService.java @@ -0,0 +1,14 @@ +package com.czg.mergedata.cur.service; + +import com.mybatisflex.core.service.IService; +import com.czg.mergedata.cur.entity.CurShopIdRelation; + +/** + * 服务层。 + * + * @author mac + * @since 2025-02-15 + */ +public interface CurShopIdRelationService extends IService { + +} diff --git a/src/main/java/com/czg/mergedata/cur/service/CurSysUserService.java b/src/main/java/com/czg/mergedata/cur/service/CurSysUserService.java index a08b417..0a3c69c 100644 --- a/src/main/java/com/czg/mergedata/cur/service/CurSysUserService.java +++ b/src/main/java/com/czg/mergedata/cur/service/CurSysUserService.java @@ -1,5 +1,6 @@ package com.czg.mergedata.cur.service; +import com.czg.mergedata.common.resp.CzgResult; import com.mybatisflex.core.service.IService; import com.czg.mergedata.cur.entity.CurSysUser; @@ -11,4 +12,5 @@ import com.czg.mergedata.cur.entity.CurSysUser; */ public interface CurSysUserService extends IService { + CzgResult mergeShopInfo(); } diff --git a/src/main/java/com/czg/mergedata/cur/service/impl/CurShopIdRelationServiceImpl.java b/src/main/java/com/czg/mergedata/cur/service/impl/CurShopIdRelationServiceImpl.java new file mode 100644 index 0000000..6d569cb --- /dev/null +++ b/src/main/java/com/czg/mergedata/cur/service/impl/CurShopIdRelationServiceImpl.java @@ -0,0 +1,18 @@ +package com.czg.mergedata.cur.service.impl; + +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.mergedata.cur.entity.CurShopIdRelation; +import com.czg.mergedata.cur.mapper.CurShopIdRelationMapper; +import com.czg.mergedata.cur.service.CurShopIdRelationService; +import org.springframework.stereotype.Service; + +/** + * 服务层实现。 + * + * @author mac + * @since 2025-02-15 + */ +@Service +public class CurShopIdRelationServiceImpl extends ServiceImpl implements CurShopIdRelationService{ + +} diff --git a/src/main/java/com/czg/mergedata/cur/service/impl/CurShopInfoImpl.java b/src/main/java/com/czg/mergedata/cur/service/impl/CurShopInfoServiceImpl.java similarity index 77% rename from src/main/java/com/czg/mergedata/cur/service/impl/CurShopInfoImpl.java rename to src/main/java/com/czg/mergedata/cur/service/impl/CurShopInfoServiceImpl.java index e4505c8..890eea0 100644 --- a/src/main/java/com/czg/mergedata/cur/service/impl/CurShopInfoImpl.java +++ b/src/main/java/com/czg/mergedata/cur/service/impl/CurShopInfoServiceImpl.java @@ -13,6 +13,6 @@ import org.springframework.stereotype.Service; * @since 2025-02-15 */ @Service -public class CurShopInfoImpl extends ServiceImpl implements CurShopInfoService{ +public class CurShopInfoServiceImpl extends ServiceImpl implements CurShopInfoService{ } diff --git a/src/main/java/com/czg/mergedata/cur/service/impl/CurShopStaffImpl.java b/src/main/java/com/czg/mergedata/cur/service/impl/CurShopStaffServiceImpl.java similarity index 76% rename from src/main/java/com/czg/mergedata/cur/service/impl/CurShopStaffImpl.java rename to src/main/java/com/czg/mergedata/cur/service/impl/CurShopStaffServiceImpl.java index cf36824..031ea57 100644 --- a/src/main/java/com/czg/mergedata/cur/service/impl/CurShopStaffImpl.java +++ b/src/main/java/com/czg/mergedata/cur/service/impl/CurShopStaffServiceImpl.java @@ -13,6 +13,6 @@ import org.springframework.stereotype.Service; * @since 2025-02-15 */ @Service -public class CurShopStaffImpl extends ServiceImpl implements CurShopStaffService{ +public class CurShopStaffServiceImpl extends ServiceImpl implements CurShopStaffService{ } diff --git a/src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserImpl.java b/src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserImpl.java deleted file mode 100644 index 8a4689e..0000000 --- a/src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.czg.mergedata.cur.service.impl; - -import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.mergedata.cur.entity.CurSysUser; -import com.czg.mergedata.cur.mapper.CurSysUserMapper; -import com.czg.mergedata.cur.service.CurSysUserService; -import org.springframework.stereotype.Service; - -/** - * 系统用户 服务层实现。 - * - * @author mac - * @since 2025-02-15 - */ -@Service -public class CurSysUserImpl extends ServiceImpl implements CurSysUserService{ - -} diff --git a/src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserServiceImpl.java b/src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserServiceImpl.java new file mode 100644 index 0000000..0ac075f --- /dev/null +++ b/src/main/java/com/czg/mergedata/cur/service/impl/CurSysUserServiceImpl.java @@ -0,0 +1,307 @@ +package com.czg.mergedata.cur.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.crypto.SecureUtil; +import com.czg.mergedata.common.resp.CzgResult; +import com.czg.mergedata.common.utils.PageUtils; +import com.czg.mergedata.cur.entity.CurShopInfo; +import com.czg.mergedata.cur.entity.CurShopStaff; +import com.czg.mergedata.cur.entity.CurSysUser; +import com.czg.mergedata.cur.mapper.CurSysUserMapper; +import com.czg.mergedata.cur.service.CurShopInfoService; +import com.czg.mergedata.cur.service.CurShopStaffService; +import com.czg.mergedata.cur.service.CurSysUserService; +import com.czg.mergedata.old.entity.OldMerchantAccount; +import com.czg.mergedata.old.entity.OldPlussShopStaff; +import com.czg.mergedata.old.entity.OldShopInfo; +import com.czg.mergedata.old.entity.OldSysUser; +import com.czg.mergedata.old.service.OldMerchantAccountService; +import com.czg.mergedata.old.service.OldPlussShopStaffService; +import com.czg.mergedata.old.service.OldShopInfoService; +import com.czg.mergedata.old.service.OldSysUserService; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryChain; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; + +/** + * 系统用户 服务层实现。 + * + * @author mac + * @since 2025-02-15 + */ +@Service +public class CurSysUserServiceImpl extends ServiceImpl implements CurSysUserService { + + @Resource + private OldSysUserService oldSysUserService; + + @Resource + private OldShopInfoService oldShopInfoService; + + @Resource + private CurShopInfoService curShopInfoService; + + @Resource + private OldMerchantAccountService oldMerchantAccountService; + + @Resource + private OldPlussShopStaffService oldStaffService; + + @Resource + private CurShopStaffService curStaffService; + + @Override + @Transactional(rollbackFor = Exception.class) + public CzgResult mergeShopInfo() { + // 账号和店铺id映射 + Map orginAccountAndShopIdMap = new HashMap<>(); + + // 老新系统店铺 id 映射 + Map oldAndCurShopIdMap = new HashMap<>(); + Map curAndOldShopIdMap = new HashMap<>(); + + List curSysUsers = execSysUser(); +// curSysUsers.forEach(curSysUser -> { +// if (!curSysUser.getAccount().contains("@")) { +// orginAccountAndShopIdMap.put(curSysUser.getAccount(), curSysUser.getId()); +// } +// }); +// +// List curShopInfos = execShopInfo(orginAccountAndShopIdMap, oldAndCurShopIdMap, curAndOldShopIdMap); +// execStaffInfo(oldAndCurShopIdMap, curAndOldShopIdMap); + return CzgResult.success("处理成功"); + } + + private List execSysUser() { + List sysUserList = new ArrayList<>(); + +// QueryWrapper queryWrapper = new QueryWrapper(); +// queryWrapper.gt(OldSysUser::getUserId, 1); + + OldSysUser byId = oldSysUserService.getById(1); +// Page page = oldSysUserService.page(PageUtils.buildPage()); +// List list = oldSysUserService.list(new QueryWrapper().ge(OldSysUser::getUserId, 1)); +// Page page = oldSysUserService.page(PageUtils.buildPage(), queryWrapper); +// Page page = oldSysUserService.page(PageUtils.buildPage()); +// +// long startUserId = 100L; +// +// while (page.hasNext() || page.getPageNumber() == 1) { +// List oldSysUsers = page.getRecords(); +// List curSysUsers = saveOldUser(oldSysUsers, startUserId); +// sysUserList.addAll(curSysUsers); +// +// page = oldSysUserService.page(PageUtils.buildPage(page.getPageNumber() + 1)); +// startUserId += page.getPageSize(); +// } + + + + return sysUserList; + } + + private List execShopInfo(Map orginAccountAndShopIdMap, Map oldAndCurShopIdMap, + Map curAndOldShopIdMap) { + List curShopInfoList = new ArrayList<>(); + Page page = oldShopInfoService.page(PageUtils.buildPage()); + + while (page.hasNext() || page.getPageNumber() == 1) { + List oldShopInfos = page.getRecords(); + + List curShopInfos = saveOldShopInfo(oldShopInfos, orginAccountAndShopIdMap, oldAndCurShopIdMap, curAndOldShopIdMap); + curShopInfoList.addAll(curShopInfos); + + page = oldShopInfoService.page(PageUtils.buildPage()); + } + + return curShopInfoList; + } + + private void execStaffInfo(Map oldAndCurShopIdMap, Map curAndOldShopIdMap) { + Page page = oldStaffService.page(PageUtils.buildPage()); + + while (page.hasNext() || page.getPageNumber() == 1) { + List oldShopStaffs = page.getRecords(); + saveOldStaffInfo(oldShopStaffs, oldAndCurShopIdMap, curAndOldShopIdMap); + page = oldStaffService.page(PageUtils.buildPage()); + } + } + + private List saveOldUser(List oldSysUsers, long startUserId) { + if (oldSysUsers == null || oldSysUsers.isEmpty()) { + return new ArrayList<>(); + } + + List curSysUsers = new ArrayList<>(); + for (int i = 0; i < oldSysUsers.size(); i++) { + OldSysUser oldSysUser = oldSysUsers.get(i); + + long userId = startUserId + i; + String password = SecureUtil.md5(userId + "czg123456"); + + CurSysUser curSysUser = new CurSysUser(); + curSysUser.setId(userId); + curSysUser.setAccount(oldSysUser.getUsername()); + curSysUser.setNickName(oldSysUser.getNickName()); + curSysUser.setGender(oldSysUser.getGender()); + curSysUser.setPhone(oldSysUser.getPhone()); + curSysUser.setEmail(oldSysUser.getEmail()); + curSysUser.setAvatar(oldSysUser.getAvatarPath()); + curSysUser.setPassword(password); + curSysUser.setIsAdmin(oldSysUser.getIsAdmin()); + curSysUser.setStauts(oldSysUser.getEnabled().intValue()); + curSysUser.setCreateUserId(1L); + curSysUser.setUpdateUserId(1L); + curSysUser.setCreateTime(oldSysUser.getCreateTime()); + curSysUser.setUpdateTime(LocalDateTime.now()); + + curSysUsers.add(curSysUser); + } + + saveBatch(curSysUsers); + + return curSysUsers; + } + + private List saveOldShopInfo(List oldShopInfos, Map orginAccountAndShopIdMap, + Map oldAndCurShopIdMap, Map curAndOldShopIdMap) { + if (oldShopInfos == null || oldShopInfos.isEmpty()) { + return new ArrayList<>(); + } + + List curShopInfos = new ArrayList<>(); + for (OldShopInfo oldShopInfo : oldShopInfos) { + // 新的 shopId 即 新系统的 sys_user_id + Long shopId = orginAccountAndShopIdMap.get(oldShopInfo.getAccount()); + + oldAndCurShopIdMap.put(oldShopInfo.getId(), shopId); + curAndOldShopIdMap.put(shopId, oldShopInfo.getId()); + + CurShopInfo curShopInfo = new CurShopInfo(); + curShopInfo.setId(shopId); + curShopInfo.setSubTitle(oldShopInfo.getSubTitle()); + curShopInfo.setShopName(oldShopInfo.getShopName()); + curShopInfo.setChainName(oldShopInfo.getChainName()); + curShopInfo.setBackImg(oldShopInfo.getBackImg()); + curShopInfo.setFrontImg(oldShopInfo.getFrontImg()); + curShopInfo.setContactName(oldShopInfo.getContactName()); + curShopInfo.setPhone(oldShopInfo.getPhone()); + curShopInfo.setLogo(oldShopInfo.getLogo()); + curShopInfo.setCoverImg(oldShopInfo.getCoverImg()); + curShopInfo.setDetail(oldShopInfo.getDetail()); + curShopInfo.setRegisterType(oldShopInfo.getRegisterType()); + curShopInfo.setShopType(oldShopInfo.getType()); + curShopInfo.setTubeType(oldShopInfo.getTubeType()); + curShopInfo.setBusinessStartDay(oldShopInfo.getBusinessStartDay()); + curShopInfo.setBusinessEndDay(oldShopInfo.getBusinessEndDay()); + curShopInfo.setBusinessTime(oldShopInfo.getBusinessTime()); + curShopInfo.setProfiles(oldShopInfo.getProfiles()); + curShopInfo.setOnSale(oldShopInfo.getOnSale()); + curShopInfo.setStatus(oldShopInfo.getStatus()); + curShopInfo.setExpireTime(DateUtil.toLocalDateTime(new Date(oldShopInfo.getExpireAt()))); + curShopInfo.setCreateTime(DateUtil.toLocalDateTime(new Date(oldShopInfo.getCreatedAt()))); + curShopInfo.setShopQrcode(oldShopInfo.getShopQrcode()); + curShopInfo.setTag(oldShopInfo.getTag()); + curShopInfo.setLat(oldShopInfo.getLat()); + curShopInfo.setLng(oldShopInfo.getLng()); + curShopInfo.setProfiles(oldShopInfo.getProfiles()); + curShopInfo.setCities(oldShopInfo.getCities()); + curShopInfo.setDistricts(oldShopInfo.getDistricts()); + curShopInfo.setIsCustomAmount(Integer.parseInt(oldShopInfo.getIsCustom())); + curShopInfo.setIsReturnPwd(Integer.parseInt(oldShopInfo.getIsReturn())); + curShopInfo.setIsMemberInPwd(Integer.parseInt(oldShopInfo.getIsMemberIn())); + curShopInfo.setIsMemberReturnPwd(Integer.parseInt(oldShopInfo.getIsMemberReturn())); + curShopInfo.setIsTableFee(oldShopInfo.getIsTableFee()); + curShopInfo.setIsMemberPrice(oldShopInfo.getIsMemberPrice()); + curShopInfo.setIsAccountPay(oldShopInfo.getIsUseVip() == null ? 0 : oldShopInfo.getIsUseVip()); + curShopInfo.setConsumeColony(oldShopInfo.getConsumeColony()); + curShopInfo.setEatModel(oldShopInfo.getEatModel()); + curShopInfo.setSmallQrcode(oldShopInfo.getSmallQrcode()); + curShopInfo.setPaymentQrcode(oldShopInfo.getPaymentQrcode()); + curShopInfo.setBookingSms(oldShopInfo.getBookingSms()); + } + + curShopInfoService.saveBatch(curShopInfos); + updateCurlShopBindInfo(curShopInfos, oldAndCurShopIdMap, curAndOldShopIdMap); + + return curShopInfos; + } + + /** + * 处理门店绑定开票信息 + */ + private void updateCurlShopBindInfo(List curShopInfos, Map oldAndCurShopIdMap, + Map curAndOldShopIdMap) { + List oldShopIds = new ArrayList<>(); + for (CurShopInfo curShopInfo : curShopInfos) { + oldShopIds.add(curShopInfo.getId()); + } + + // 查询旧的 店铺绑定的开票信息 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.in(OldMerchantAccount::getShopId, oldShopIds); + List merchantAccounts = oldMerchantAccountService.list(queryWrapper); + Map oldMerchantAccountMap = new HashMap<>(); + for (OldMerchantAccount oldMerchantAccount : merchantAccounts) { + oldMerchantAccountMap.put(Long.valueOf(oldMerchantAccount.getShopId()), oldMerchantAccount); + } + + // 处理新的 店铺绑定的开票信息 + for (CurShopInfo curShopInfo : curShopInfos) { + Long oldShopId = curAndOldShopIdMap.get(curShopInfo.getId()); + + OldMerchantAccount oldMerchantAccount = oldMerchantAccountMap.get(oldShopId); + if (oldMerchantAccount == null) { + continue; + } + + curShopInfo.setOperationPwd(oldMerchantAccount.getPwd()); + curShopInfo.setBindAccount(oldMerchantAccount.getBindAccount()); + curShopInfo.setArticle(oldMerchantAccount.getArticle()); + curShopInfo.setSdType(oldMerchantAccount.getSdType()); + curShopInfo.setSdType(oldMerchantAccount.getSdType()); + } + + curShopInfoService.updateBatch(curShopInfos); + } + + private void saveOldStaffInfo(List oldShopStaffs, Map oldAndCurShopIdMap, + Map curAndOldShopIdMap) { + List curShopStaffs = new ArrayList<>(); + List curSysUsers = new ArrayList<>(); + + for (OldPlussShopStaff oldShopStaff : oldShopStaffs) { + CurShopStaff curShopStaff = new CurShopStaff(); + Long curShopId = oldAndCurShopIdMap.get(Long.valueOf(oldShopStaff.getShopId())); + + curShopStaff.setCode(oldShopStaff.getCode()); + curShopStaff.setName(oldShopStaff.getName()); + curShopStaff.setMaxDiscountAmount(oldShopStaff.getMaxDiscountAmount()); + curShopStaff.setDiscountType(oldShopStaff.getDiscountType()); + curShopStaff.setStatus(oldShopStaff.getStatus()); + curShopStaff.setShopId(curShopId); + curShopStaff.setType(oldShopStaff.getType()); + curShopStaff.setIsManage(oldShopStaff.getIsManage()); + curShopStaff.setIsPc(oldShopStaff.getIsPc()); + curShopStaff.setCreateTime(DateUtil.toLocalDateTime(new Date(oldShopStaff.getCreatedAt()))); + + curShopStaffs.add(curShopStaff); + + CurSysUser curSysUser = getOne(new QueryWrapper().eq(CurSysUser::getAccount, oldShopStaff.getShopId() + "@" + oldShopStaff.getAccount())); + if (curSysUser != null) { + curSysUser.setAccount(curShopId + "@" + curSysUser.getAccount()); + curSysUsers.add(curSysUser); + } + } + + curStaffService.saveBatch(curShopStaffs); + updateBatch(curSysUsers); + } +} diff --git a/src/main/java/com/czg/mergedata/old/entity/OldMerchantAccount.java b/src/main/java/com/czg/mergedata/old/entity/OldMerchantAccount.java new file mode 100644 index 0000000..09466f0 --- /dev/null +++ b/src/main/java/com/czg/mergedata/old/entity/OldMerchantAccount.java @@ -0,0 +1,150 @@ +package com.czg.mergedata.old.entity; + +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; + +import java.io.Serial; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 商家登陆帐号 实体类。 + * + * @author mac + * @since 2025-02-15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("tb_merchant_account") +public class OldMerchantAccount implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 自增id + */ + @Id(keyType = KeyType.Auto) + private Integer id; + + /** + * 登陆帐号 + */ + private String account; + + /** + * 登陆密码 + */ + private String password; + + /** + * 商家Id + */ + private String merchantId; + + /** + * 门店Id + */ + private String shopId; + + private String shopSnap; + + /** + * 是否管理员 + */ + private Integer isAdmin; + + /** + * 是否商户:1商户帐号0-店铺帐号 + */ + private Integer isMercantile; + + /** + * 姓名 + */ + private String name; + + /** + * 性别:0女 1 男 + */ + private Integer sex; + + /** + * 邮箱 + */ + private String email; + + /** + * 头像 + */ + private String headImg; + + /** + * 联系电话 + */ + private String telephone; + + /** + * 状态 + */ + private Boolean status; + + /** + * 排序 + */ + private Integer sort; + + private Integer roleId; + + /** + * 最后登陆时间 + */ + private Integer lastLoginAt; + + /** + * 公众号openId + */ + private String mpOpenId; + + /** + * 是否接收消息通知 + */ + private Integer msgAble; + + private Long createdAt; + + private Long updatedAt; + + /** + * 操作密码 + */ + private String pwd; + + /** + * 开票系统账号 + */ + private String bindAccount; + + /** + * 项目分类 + */ + private String article; + + /** + * 数电发票类型 + */ + private String sdType; + + /** + * 税率 + */ + private String taxAmount; + +} diff --git a/src/main/java/com/czg/mergedata/old/mapper/OldMerchantAccountMapper.java b/src/main/java/com/czg/mergedata/old/mapper/OldMerchantAccountMapper.java new file mode 100644 index 0000000..3db9f0e --- /dev/null +++ b/src/main/java/com/czg/mergedata/old/mapper/OldMerchantAccountMapper.java @@ -0,0 +1,14 @@ +package com.czg.mergedata.old.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.mergedata.old.entity.OldMerchantAccount; + +/** + * 商家登陆帐号 映射层。 + * + * @author mac + * @since 2025-02-15 + */ +public interface OldMerchantAccountMapper extends BaseMapper { + +} diff --git a/src/main/java/com/czg/mergedata/old/service/OldMerchantAccountService.java b/src/main/java/com/czg/mergedata/old/service/OldMerchantAccountService.java new file mode 100644 index 0000000..117493a --- /dev/null +++ b/src/main/java/com/czg/mergedata/old/service/OldMerchantAccountService.java @@ -0,0 +1,14 @@ +package com.czg.mergedata.old.service; + +import com.mybatisflex.core.service.IService; +import com.czg.mergedata.old.entity.OldMerchantAccount; + +/** + * 商家登陆帐号 服务层。 + * + * @author mac + * @since 2025-02-15 + */ +public interface OldMerchantAccountService extends IService { + +} diff --git a/src/main/java/com/czg/mergedata/old/service/impl/OldMerchantAccountServiceImpl.java b/src/main/java/com/czg/mergedata/old/service/impl/OldMerchantAccountServiceImpl.java new file mode 100644 index 0000000..43d7f9c --- /dev/null +++ b/src/main/java/com/czg/mergedata/old/service/impl/OldMerchantAccountServiceImpl.java @@ -0,0 +1,18 @@ +package com.czg.mergedata.old.service.impl; + +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.mergedata.old.entity.OldMerchantAccount; +import com.czg.mergedata.old.mapper.OldMerchantAccountMapper; +import com.czg.mergedata.old.service.OldMerchantAccountService; +import org.springframework.stereotype.Service; + +/** + * 商家登陆帐号 服务层实现。 + * + * @author mac + * @since 2025-02-15 + */ +@Service +public class OldMerchantAccountServiceImpl extends ServiceImpl implements OldMerchantAccountService{ + +} diff --git a/src/main/java/com/czg/mergedata/old/service/impl/OldPlussShopStaffImpl.java b/src/main/java/com/czg/mergedata/old/service/impl/OldPlussShopStaffServiceImpl.java similarity index 74% rename from src/main/java/com/czg/mergedata/old/service/impl/OldPlussShopStaffImpl.java rename to src/main/java/com/czg/mergedata/old/service/impl/OldPlussShopStaffServiceImpl.java index 09b15b1..c7fd2ec 100644 --- a/src/main/java/com/czg/mergedata/old/service/impl/OldPlussShopStaffImpl.java +++ b/src/main/java/com/czg/mergedata/old/service/impl/OldPlussShopStaffServiceImpl.java @@ -13,6 +13,6 @@ import org.springframework.stereotype.Service; * @since 2025-02-15 */ @Service -public class OldPlussShopStaffImpl extends ServiceImpl implements OldPlussShopStaffService{ +public class OldPlussShopStaffServiceImpl extends ServiceImpl implements OldPlussShopStaffService{ } diff --git a/src/main/java/com/czg/mergedata/old/service/impl/OldShopInfoImpl.java b/src/main/java/com/czg/mergedata/old/service/impl/OldShopInfoServiceImpl.java similarity index 76% rename from src/main/java/com/czg/mergedata/old/service/impl/OldShopInfoImpl.java rename to src/main/java/com/czg/mergedata/old/service/impl/OldShopInfoServiceImpl.java index 11f03d6..a1ff99d 100644 --- a/src/main/java/com/czg/mergedata/old/service/impl/OldShopInfoImpl.java +++ b/src/main/java/com/czg/mergedata/old/service/impl/OldShopInfoServiceImpl.java @@ -13,6 +13,6 @@ import org.springframework.stereotype.Service; * @since 2025-02-15 */ @Service -public class OldShopInfoImpl extends ServiceImpl implements OldShopInfoService{ +public class OldShopInfoServiceImpl extends ServiceImpl implements OldShopInfoService{ } diff --git a/src/main/java/com/czg/mergedata/old/service/impl/OldSysUserImpl.java b/src/main/java/com/czg/mergedata/old/service/impl/OldSysUserServiceImpl.java similarity index 77% rename from src/main/java/com/czg/mergedata/old/service/impl/OldSysUserImpl.java rename to src/main/java/com/czg/mergedata/old/service/impl/OldSysUserServiceImpl.java index f40d5a6..6872cb6 100644 --- a/src/main/java/com/czg/mergedata/old/service/impl/OldSysUserImpl.java +++ b/src/main/java/com/czg/mergedata/old/service/impl/OldSysUserServiceImpl.java @@ -13,6 +13,6 @@ import org.springframework.stereotype.Service; * @since 2025-02-15 */ @Service -public class OldSysUserImpl extends ServiceImpl implements OldSysUserService{ +public class OldSysUserServiceImpl extends ServiceImpl implements OldSysUserService{ } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 9923ef3..54b6878 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -2,12 +2,12 @@ spring: datasource: cur: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/czg_cashier?useUnicode=true&characterEncoding=utf-8 + jdbc-url: jdbc:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/czg_cashier?useUnicode=true&characterEncoding=utf-8 username: cashier password: Cashier@1@ old: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/fycashier_test?useUnicode=true&characterEncoding=utf-8 + jdbc-url: jdbc:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/fycashier_test?useUnicode=true&characterEncoding=utf-8 username: cashier password: Cashier@1@ diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 42a83d9..2595083 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8100 + port: 8900 servlet: context-path: /merge @@ -13,3 +13,6 @@ logging: config: classpath:logback.xml +mybatis: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/src/main/resources/mapper/cur/ShopIdRelationMapper.xml b/src/main/resources/mapper/cur/ShopIdRelationMapper.xml new file mode 100644 index 0000000..6760874 --- /dev/null +++ b/src/main/resources/mapper/cur/ShopIdRelationMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/src/main/resources/mapper/old/MerchantAccountMapper.xml b/src/main/resources/mapper/old/MerchantAccountMapper.xml new file mode 100644 index 0000000..a2a7561 --- /dev/null +++ b/src/main/resources/mapper/old/MerchantAccountMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/收银机数据迁移关系.md b/收银机数据迁移关系.md new file mode 100644 index 0000000..c4a0464 --- /dev/null +++ b/收银机数据迁移关系.md @@ -0,0 +1,17 @@ +# 收银机数据迁移关系 + +## 1 系统用户、商户、员工 + +### 1.1 系统用户 + +1. 系统用户全部迁移到新数据库 + +2. 密码默认为 czg123456 + +### 1.2 商户 + +1. 迁移所有商户数据 +2. 根据 account -> 对应 sys_user username 将shop_info id设置为 sys_user id + +#### 1.2.1 保存新的 shop_id 和 原来shop_id 对应关系 +> 表名:shop_id_relation