diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java index da8e048..7d40115 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java @@ -4,8 +4,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cus.vo.CusMainVO; +import com.ruoyi.utils.CodeGenerator; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -38,7 +43,36 @@ public class CusMainController extends BaseController { @Autowired private ICusMainService cusMainService; + @Autowired + private CodeGenerator codeGenerator; + /** + * 生成客户编码 + */ + @GetMapping("/generateCode") + public AjaxResult generateCustomerCode() { + try { + String code = codeGenerator.generate(); + return AjaxResult.success("编码生成成功", code); + } catch (RuntimeException e) { + return AjaxResult.error(e.getMessage()); + } + } + /** + * 校验编码是否重复 + */ + @GetMapping("/checkCode") + public AjaxResult checkCode(String code) { + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(CusMain::getCusCode, code); + if (cusMainService.count(queryWrapper) > 0) { + return AjaxResult.error("编码重复"); + } + return success(); + } catch (RuntimeException e) { + return AjaxResult.error(e.getMessage()); + } + } /** * 查询客户信息列表 */ @@ -82,9 +116,9 @@ public class CusMainController extends BaseController @PreAuthorize("@ss.hasPermi('cus:main:add')") @Log(title = "客户信息", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody CusMain cusMain) - { - return toAjax(cusMainService.save(cusMain)); + public AjaxResult add(@RequestBody CusMainVO cusMainVO){ + cusMainService.saveNewCus(cusMainVO); + return success(); } /** diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java index bcef93e..f78788e 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java @@ -66,14 +66,5 @@ public class CusBank extends DlBaseEntity @Excel(name = "税号") private String taxId; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java index 95997b0..09d24ca 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java @@ -50,14 +50,5 @@ public class CusCompany extends DlBaseEntity @Excel(name = "联系地址") private String contactAddress; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java index 5065454..ab9ffa8 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java @@ -27,7 +27,6 @@ public class CusContacts extends DlBaseEntity private static final long serialVersionUID = 1L; /** 主键(使用雪花算法生成唯一主键) */ - @TableId(type = IdType.ASSIGN_UUID) private Long id; /** 客户ID */ @@ -79,14 +78,5 @@ public class CusContacts extends DlBaseEntity @Excel(name = "是否默认联系人") private Boolean ifDefault; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusEmail.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusEmail.java index dc2c333..80d3581 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusEmail.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusEmail.java @@ -70,14 +70,6 @@ public class CusEmail extends DlBaseEntity @Excel(name = "是否已读") private Integer ifRead; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusFollow.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusFollow.java index 87f25be..9e36521 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusFollow.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusFollow.java @@ -122,14 +122,5 @@ public class CusFollow extends DlBaseEntity @Excel(name = "是否完成") private Integer ifCompleted; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMain.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMain.java index 4d22b71..e4db88e 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMain.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMain.java @@ -74,12 +74,4 @@ public class CusMain extends DlBaseEntity /** 附件 */ private String files; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - private Date updatedTime; - } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java index 5418fc8..b446f28 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java @@ -54,14 +54,5 @@ public class CusManager extends DlBaseEntity @Excel(name = "原部门") private String oldDept; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMark.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMark.java index 7b15f58..9a459ee 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMark.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusMark.java @@ -46,14 +46,5 @@ public class CusMark extends DlBaseEntity @Excel(name = "图形文件路径") private String imageUrl; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusTimeAxis.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusTimeAxis.java index b8cd80f..2a40bab 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusTimeAxis.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusTimeAxis.java @@ -54,14 +54,5 @@ public class CusTimeAxis extends DlBaseEntity @Excel(name = "备注") private String remark; - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdTime; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedTime; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java index e372399..bab20d8 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.cus.domain.CusMain; +import com.ruoyi.cus.vo.CusMainVO; /** * 客户信息Service接口 @@ -15,4 +16,12 @@ import com.ruoyi.cus.domain.CusMain; public interface ICusMainService extends IService { IPage queryListPage(CusMain pageReqVO, Page page); + + /** + * 新增客户信息 + * @author vinjor-M + * @date 15:56 2025/11/6 + * @param cusMainVO TODO + **/ + void saveNewCus(CusMainVO cusMainVO); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java index d18712d..dba1928 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java @@ -3,12 +3,15 @@ package com.ruoyi.cus.service.impl; import java.util.List; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cus.domain.*; +import com.ruoyi.cus.mapper.*; +import com.ruoyi.cus.service.*; +import com.ruoyi.cus.vo.CusMainVO; +import com.ruoyi.utils.SnowflakeIdGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.cus.mapper.CusMainMapper; -import com.ruoyi.cus.domain.CusMain; -import com.ruoyi.cus.service.ICusMainService; +import org.springframework.transaction.annotation.Transactional; /** * 客户信息Service业务层处理 @@ -21,9 +24,62 @@ public class CusMainServiceImpl extends ServiceImpl impl { @Autowired private CusMainMapper cusMainMapper; + @Autowired + private SnowflakeIdGenerator snowflakeIdGenerator; + @Autowired + private ICusContactsService cusContactsService; + @Autowired + private ICusManagerService cusManagerService; + @Autowired + private ICusCompanyService cusCompanyService; + @Autowired + private ICusBankService cusBankService; + @Autowired + private ICusMarkService cusMarkService; @Override public IPage queryListPage(CusMain pageReqVO, Page page) { return cusMainMapper.queryListPage(pageReqVO, page); } + + /** + * 新增客户信息 + * + * @param cusMainVO TODO + * @author vinjor-M + * @date 15:56 2025/11/6 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveNewCus(CusMainVO cusMainVO) { + CusMain cusMain = cusMainVO.getMainInfo(); + cusMainMapper.insert(cusMain); + //联系人信息 + List contacts = cusMainVO.getContact(); + for (CusContacts contact : contacts) { + contact.setId(snowflakeIdGenerator.generateId()); + contact.setCusId(cusMain.getId()); + } + cusContactsService.saveBatch(contacts); + //公司信息 + CusCompany cusCompany = cusMainVO.getCompanyInfo(); + cusCompany.setCusId(cusMain.getId()); + cusCompanyService.save(cusCompany); + //管理信息 + CusManager cusManager = cusMainVO.getManagementInfo(); + cusManager.setCusId(cusMain.getId()); + cusManagerService.save(cusManager); + //银行信息 + List bankList = cusMainVO.getBankInfo(); + if(!bankList.isEmpty()){ + bankList.forEach(bank -> bank.setCusId(cusMain.getId())); + cusBankService.saveBatch(bankList); + } + //唛头信息 + List markList = cusMainVO.getMark(); + if(!markList.isEmpty()){ + markList.forEach(mark -> mark.setCusId(cusMain.getId())); + cusMarkService.saveBatch(markList); + } + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/vo/CusMainVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/vo/CusMainVO.java new file mode 100644 index 0000000..f73a70b --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/vo/CusMainVO.java @@ -0,0 +1,22 @@ +package com.ruoyi.cus.vo; + +import com.ruoyi.cus.domain.*; +import lombok.Data; + +import java.util.List; + +@Data +public class CusMainVO { + /** 客户信息 */ + private CusMain mainInfo; + /** 联系人信息 */ + private List contact; + /** 公司信息 */ + private CusCompany companyInfo; + /** 管理信息 */ + private CusManager managementInfo; + /** 银行信息 */ + private List bankInfo; + /** 唛头信息 */ + private List mark; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/CodeGenerator.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/CodeGenerator.java new file mode 100644 index 0000000..603e301 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/CodeGenerator.java @@ -0,0 +1,66 @@ +package com.ruoyi.utils; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * 编码生成工具 + * @author vinjor-M + * @date 15:31 2025/11/6 +**/ +@Component +public class CodeGenerator { + /** + * Redis键前缀(存储每日自增序号) + */ + private static final String REDIS_KEY_PREFIX = "customer:code:seq:"; + + /** + * 编码前缀 + */ + private static final String CODE_PREFIX = "CD"; + + /** + * 自增序号位数(不足补0) + */ + private static final int SEQ_LENGTH = 3; + + /** + * 每日最大序号(3位最大为999) + */ + private static final long MAX_SEQ = 999L; + + @Resource + private RedisTemplate redisTemplate; + + /** + * 生成客户编码 + * @return 格式:CD+年月日+3位自增数 + */ + public String generate() { + // 1. 获取当天日期字符串(yyyyMMdd) + String dateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN); + + // 2. 构建Redis键(每日一个独立键,实现序号日重置) + String redisKey = REDIS_KEY_PREFIX + dateStr; + + // 3. Redis原子自增(保证并发安全) + Long seq = redisTemplate.opsForValue().increment(redisKey, 1); + + // 4. 校验序号是否超出最大值 + if (seq == null || seq > MAX_SEQ) { + throw new RuntimeException("今日客户编码已达上限(999个),请明日再试"); + } + + // 5. 序号补零(不足3位前面补0) + String seqStr = String.format("%0" + SEQ_LENGTH + "d", seq); + + // 6. 拼接最终编码 + return CODE_PREFIX + dateStr + seqStr; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/SnowflakeIdGenerator.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/SnowflakeIdGenerator.java new file mode 100644 index 0000000..0d33ddc --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/SnowflakeIdGenerator.java @@ -0,0 +1,172 @@ +package com.ruoyi.utils; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import java.util.concurrent.atomic.AtomicLong; + +/** + * 雪花算法ID生成器(适配RuoYi框架,支持16表分表) + * 分表逻辑:ID % 16 → 0-15,对应16个分表 + */ +@Component +public class SnowflakeIdGenerator implements InitializingBean { + /** + * 起始时间戳(2025-01-01 00:00:00,可自定义) + */ + private static final long START_TIMESTAMP = 1735689600000L; + + /** + * 数据中心ID位数(5位,支持0-31) + */ + private static final int DATA_CENTER_ID_BITS = 5; + + /** + * 机器ID位数(5位,支持0-31) + */ + private static final int MACHINE_ID_BITS = 5; + + /** + * 序列号位数(12位,支持0-4095) + */ + private static final int SEQUENCE_BITS = 12; + + /** + * 最大数据中心ID(31) + */ + private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS); + + /** + * 最大机器ID(31) + */ + private static final long MAX_MACHINE_ID = ~(-1L << MACHINE_ID_BITS); + + /** + * 序列号掩码(4095) + */ + private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS); + + /** + * 机器ID左移位数(12位) + */ + private static final int MACHINE_ID_SHIFT = SEQUENCE_BITS; + + /** + * 数据中心ID左移位数(12+5=17位) + */ + private static final int DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS; + + /** + * 时间戳左移位数(12+5+5=22位) + */ + private static final int TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS + DATA_CENTER_ID_BITS; + + /** + * 数据中心ID(从配置文件读取) + */ + @Value("${snowflake.data-center-id:0}") + private long dataCenterId; + + /** + * 机器ID(从配置文件读取,分布式部署时需唯一) + */ + @Value("${snowflake.machine-id:0}") + private long machineId; + + /** + * 上次生成ID的时间戳 + */ + private volatile long lastTimestamp = -1L; + + /** + * 序列号(原子类保证线程安全) + */ + private final AtomicLong sequence = new AtomicLong(0L); + + /** + * 初始化校验:机器ID和数据中心ID不能超出最大值 + */ + @Override + public void afterPropertiesSet() throws Exception { + if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) { + throw new IllegalArgumentException(String.format("数据中心ID必须在0-%d之间", MAX_DATA_CENTER_ID)); + } + if (machineId > MAX_MACHINE_ID || machineId < 0) { + throw new IllegalArgumentException(String.format("机器ID必须在0-%d之间", MAX_MACHINE_ID)); + } + } + + /** + * 生成雪花算法ID(Long类型) + */ + public synchronized long generateId() { + long currentTimestamp = System.currentTimeMillis(); + + // 处理时钟回拨(避免ID重复) + if (currentTimestamp < lastTimestamp) { + throw new RuntimeException(String.format("时钟回拨异常!当前时间戳:%d,上次时间戳:%d", currentTimestamp, lastTimestamp)); + } + + // 同一时间戳内,序列号自增 + if (currentTimestamp == lastTimestamp) { + sequence.set((sequence.get() + 1) & SEQUENCE_MASK); + // 序列号用尽,等待下一毫秒 + if (sequence.get() == 0) { + currentTimestamp = waitNextMillis(lastTimestamp); + } + } else { + // 新的时间戳,序列号重置为0 + sequence.set(0L); + } + + // 更新上次生成ID的时间戳 + lastTimestamp = currentTimestamp; + + // 拼接64位ID:时间戳左移22位 + 数据中心ID左移17位 + 机器ID左移12位 + 序列号 + return ((currentTimestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) + | (dataCenterId << DATA_CENTER_ID_SHIFT) + | (machineId << MACHINE_ID_SHIFT) + | sequence.get(); + } + + /** + * 等待下一毫秒(避免序列号用尽) + */ + private long waitNextMillis(long lastTimestamp) { + long currentTimestamp = System.currentTimeMillis(); + while (currentTimestamp <= lastTimestamp) { + currentTimestamp = System.currentTimeMillis(); + } + return currentTimestamp; + } + + /** + * 生成ID(String类型,避免前端Long精度丢失) + */ + public String generateIdStr() { + return String.valueOf(generateId()); + } + + /** + * 根据ID获取分表索引(0-15),用于16表分表 + * @param id 雪花算法生成的ID + * @return 分表索引(0-15) + */ + public int getTableIndex(Long id) { + if (id == null) { + throw new IllegalArgumentException("ID不能为空"); + } + // 取序列号部分(低12位),再取模16(保证均匀分布到16个表) + return (int) (id & 0xF); // 0xF = 15,等价于 id % 16 + } + + /** + * 重载:支持String类型ID + */ + public int getTableIndex(String idStr) { + if (idStr == null || idStr.isEmpty()) { + throw new IllegalArgumentException("ID字符串不能为空"); + } + return getTableIndex(Long.parseLong(idStr)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/resources/application.yml b/dl_admin/ruoyi-admin/src/main/resources/application.yml index 8daeaa8..4e0f832 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/application.yml +++ b/dl_admin/ruoyi-admin/src/main/resources/application.yml @@ -153,32 +153,16 @@ aliyun: access-key-id: LTAI5tLThQFWgMLRTf3siNjb access-key-secret: M5HjOyB8ir5tYEPFOQwImfJNgsumaG bucket-name: dianliang123 -# Dify API 配置 -dify: - api: - key: app-tRfIOnRtIb5fTeXRcJ46aWVh - url: https://api.dify.ai/v1 -#dify: -# api: -# key: app-ahgDwrLi8KQ6V0aEKKwT6Io7 -# url: http://10.19.128.77/v1 # 登录相关配置 login: # 是否限制单用户登录 single: true - -# Python环境配置 -python: - # Python可执行文件路径 - path: python3 - # 脚本超时时间(分钟) - timeoutMinutes: 30 - # 脚本 - scripts: - # 信通院爬虫脚本 - caict: /Users/menfutong/workspace/myproject/design-spider/dl_industry_ai/dl_admin/python_scripts/busi_caict_spider.py +# 雪花算法配置 +snowflake: + data-center-id: 0 # 数据中心ID(0-31),多数据中心部署时区分 + machine-id: 0 # 机器ID(0-31),同一数据中心内机器唯一(分布式部署必填不同值) diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusBankMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusBankMapper.xml index 0720435..b5cc78a 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusBankMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusBankMapper.xml @@ -17,13 +17,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_id, bank_account, bank_name, currency, bank_code, swift_code, bank_address, branch_code, tax_id, del_flag, creator, created_time, updater, updated_time from cus_bank + select id, cus_id, bank_account, bank_name, currency, bank_code, swift_code, bank_address, branch_code, tax_id, del_flag, creator, create_time, updater, update_time from cus_bank \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusCompanyMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusCompanyMapper.xml index 9b466e2..a84b43b 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusCompanyMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusCompanyMapper.xml @@ -13,13 +13,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_id, cus_from, cus_level, busi_type, contact_address, del_flag, creator, created_time, updater, updated_time from cus_company + select id, cus_id, cus_from, cus_level, busi_type, contact_address, del_flag, creator, create_time, updater, update_time from cus_company \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusContactsMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusContactsMapper.xml index 8b062fe..6ae8687 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusContactsMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusContactsMapper.xml @@ -19,13 +19,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_id, name, nick_name, sex, birthday, email, contact_address, telephone, whats_app, wechat, qq, del_flag, creator, created_time, updater, updated_time from cus_contacts + select id, cus_id, name, nick_name, sex, birthday, email, contact_address, telephone, whats_app, wechat, qq, del_flag, creator, create_time, updater, update_time from cus_contacts \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusEmailMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusEmailMapper.xml index 9a73459..115ea8a 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusEmailMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusEmailMapper.xml @@ -18,13 +18,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_id, contact_id, sender, receiver, send_type, subject, content, files, if_star, if_read, del_flag, creator, created_time, updater, updated_time from cus_email + select id, cus_id, contact_id, sender, receiver, send_type, subject, content, files, if_star, if_read, del_flag, creator, create_time, updater, update_time from cus_email \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusFollowMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusFollowMapper.xml index 81902f9..c11341e 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusFollowMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusFollowMapper.xml @@ -30,13 +30,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_id, contact_id, follow_type, follow_content, follow_time, schedule_color, files, follow_way, follow_step, if_sync_cus, again_time, if_always_remind, cycle_type, cycle_other_type, cycle_other_value, cycle_start, cycle_end, busi_name, busi_id, user_id, other_user_ids, if_completed, del_flag, creator, created_time, updater, updated_time from cus_follow + select id, cus_id, contact_id, follow_type, follow_content, follow_time, schedule_color, files, follow_way, follow_step, if_sync_cus, again_time, if_always_remind, cycle_type, cycle_other_type, cycle_other_value, cycle_start, cycle_end, busi_name, busi_id, user_id, other_user_ids, if_completed, del_flag, creator, create_time, updater, update_time from cus_follow \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml index c591f02..978bc20 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml @@ -19,13 +19,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_labels, cus_code, full_name, short_name, cus_type, country, zone_name, main_prods, site_url, remark, files, del_flag, creator, created_time, updater, updated_time from cus_main + select id, cus_labels, cus_code, full_name, short_name, cus_type, country, zone_name, main_prods, site_url, remark, files, del_flag, creator, create_time, updater, update_time from cus_main @@ -32,8 +32,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and seas_reason = #{entity.seasReason} and seas_group = #{entity.seasGroup} and old_dept = #{entity.oldDept} - and created_time = #{entity.createdTime} - and updated_time = #{entity.updatedTime} + and create_time = #{entity.createTime} + and update_time = #{entity.updateTime} \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMarkMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMarkMapper.xml index 87896c2..bd0632c 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMarkMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMarkMapper.xml @@ -12,13 +12,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_id, mark_position, text_content, image_url, del_flag, creator, created_time, updater, updated_time from cus_mark + select id, cus_id, mark_position, text_content, image_url, del_flag, creator, create_time, updater, update_time from cus_mark \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusTimeAxisMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusTimeAxisMapper.xml index 2bcdacf..549c62e 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusTimeAxisMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusTimeAxisMapper.xml @@ -14,13 +14,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - select id, cus_code, busi_max_catg, busi_catg, contact_id, content, remark, del_flag, creator, created_time, updater, updated_time from cus_time_axis + select id, cus_code, busi_max_catg, busi_catg, contact_id, content, remark, del_flag, creator, create_time, updater, update_time from cus_time_axis \ No newline at end of file diff --git a/dl_vue/src/App.vue b/dl_vue/src/App.vue index f4b5f11..e19fc6a 100644 --- a/dl_vue/src/App.vue +++ b/dl_vue/src/App.vue @@ -41,4 +41,12 @@ export default { text-overflow: ellipsis; display: inline-block; /* 确保宽度生效 */ } +::v-deep .el-drawer__header{ + margin-bottom: 10px !important; + padding-bottom: 15px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); /* 轻微阴影,增强层次感 */ +} +::v-deep .el-date-editor{ + width: 100% !important; +} diff --git a/dl_vue/src/api/cus/main.js b/dl_vue/src/api/cus/main.js index 072bf14..6a37c0a 100644 --- a/dl_vue/src/api/cus/main.js +++ b/dl_vue/src/api/cus/main.js @@ -1,5 +1,21 @@ import request from '@/utils/request' +// 获取客户编码 +export function getCode() { + return request({ + url: '/cus/main/generateCode', + method: 'get' + }) +} +// 校验编码是否重复 +export function checkCode(query) { + return request({ + url: '/cus/main/checkCode', + method: 'get', + params: query + }) +} + // 查询客户信息列表 export function listMain(query) { return request({ diff --git a/dl_vue/src/views/cus/main/drawForm.vue b/dl_vue/src/views/cus/main/drawForm.vue new file mode 100644 index 0000000..0bb0d4a --- /dev/null +++ b/dl_vue/src/views/cus/main/drawForm.vue @@ -0,0 +1,566 @@ + + + + + diff --git a/dl_vue/src/views/cus/main/index.vue b/dl_vue/src/views/cus/main/index.vue index b8b0145..f46a010 100644 --- a/dl_vue/src/views/cus/main/index.vue +++ b/dl_vue/src/views/cus/main/index.vue @@ -42,6 +42,16 @@ + + 快速新增 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/dl_vue/src/views/cus/main/newForm.vue b/dl_vue/src/views/cus/main/newForm.vue index 218ff3f..45e7e9f 100644 --- a/dl_vue/src/views/cus/main/newForm.vue +++ b/dl_vue/src/views/cus/main/newForm.vue @@ -536,7 +536,7 @@ function debounce(fn, delay = 100) { }, delay) } } - +import { getCode, addMain } from "@/api/cus/main"; // 在组件中引入 import { mapGetters } from 'vuex'