bug列表158(所有规则增加前缀、后缀属性,并在申请编码时进行前后缀拼接)修复;集成系统信息管理,创建修改删除,同步到用户的账号创建、删除、修改操作。
已修改15个文件
已添加1个文件
300 ■■■■■ 文件已修改
Source/UBCS-WEB/src/const/code/codebasic.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/code.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/granter/PwdFreeLoginTokenGranter.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/enums/UserStatus.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/feign/IUserClient.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/poi/util/ExcelUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeBasicSecController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/IDockingSystemService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/DockingSystemServiceImpl.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/feign/UserClient.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codebasic.js
@@ -43,7 +43,14 @@
      {
        label: "码段类型",
        prop: "secTypeText",
      }
      },
      {
        label: "前缀",
        prop: "prefixCode",
      },
      {
        label: "后缀",
        prop: "suffixCode",
      },
    ]
}
Source/UBCS-WEB/src/views/code/code.vue
@@ -1552,8 +1552,8 @@
        serialDependFlag: false, //是否流水依赖
        serialDependOrder: "", //流水依赖顺序
        nullableFlag: false, //是否为空
        prefix: "", //前缀
        suffix: "", //后缀
        prefixCode: "", //前缀
        suffixCode: "", //后缀
        displayFlag: false, //
        componentCodeFlag: false, //是否参与编码
        pkCodeRule: "", //所属编码规则
@@ -3219,16 +3219,18 @@
      }
      this.form = {
        oid: row !=null ? row.oid:this.form.oid,
        id: row !=null ? row.id:this.form.id, //编号,
        name: row !=null ? row.name:this.form.name, //名称
        secType: row !=null ?  row.secType:this.form.secType, //码段类型
        description:  row !=null ? row.description:this.form.description, //描述
        id: row != null ? row.id:this.form.id, //编号,
        name: row != null ? row.name:this.form.name, //名称
        secType: row != null ?  row.secType:this.form.secType, //码段类型
        description:  row != null ? row.description:this.form.description, //描述
        serialDependFlag: this.isNullJsonBoolean(row,this.form, 'serialDependFlag'), //是否流水依赖
        serialDependOrder:  row !=null ? row.serialDependOrder:this.form.serialDependOrder, //流水依赖顺序
        nullableFlag: this.isNullJsonBoolean(row, this.form, 'nullableFlag'), //是否为空
        displayFlag: this.isNullJsonBoolean(row, this.form, 'displayFlag'),
        componentCodeFlag: this.isNullJsonBoolean(row, this.form, 'componentCodeFlag'), //是否参与编码
        pkCodeRule:  row !=null ? row.pkCodeRule:this.form.pkCodeRule, //所属编码规则
        pkCodeRule:  row != null ? row.pkCodeRule:this.form.pkCodeRule, //所属编码规则
        prefixCode: row != null ? row.prefixCode:this.form.prefixCode, //前缀
        suffixCode: row!= null ? row.suffixCode:this.form.suffixCode, //后缀
      };
      if (this.form.secType === "codefixedsec") {
        //固定码段
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/granter/PwdFreeLoginTokenGranter.java
@@ -85,13 +85,14 @@
        // æž„建授权信息
        User user = result.getData().getUser();
        Kv detail = result.getData().getDetail();
        if (Func.isEmpty(user) || Func.isEmpty(user.getId())) {
            throw new InvalidGrantException("passwordfree grant failure, user is null");
        }
        // åˆ¤æ–­å½“前用户是否被停用
        if(user.getUserStatus() == 1){
            throw new InvalidGrantException(TokenUtil.USER_LOCK);
        }
        Kv detail = result.getData().getDetail();
        if (user == null || user.getId() == null) {
            throw new InvalidGrantException("passwordfree grant failure, user is null");
        }
        bladeUserDetails = new BladeUserDetails(user.getId(),
            tenantId, result.getData().getOauthId(), user.getName(), user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), Func.join(result.getData().getRoles()), Func.toStr(user.getAvatar(), TokenUtil.DEFAULT_AVATAR),
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java
@@ -252,6 +252,30 @@
     */
    private String suffixCode;
    public Boolean getClearValue() {
        return isClearValue;
    }
    public String getPrefixCode() {
        return prefixCode;
    }
    public String getSuffixCode() {
        return suffixCode;
    }
    public void setClearValue(Boolean clearValue) {
        isClearValue = clearValue;
    }
    public void setPrefixCode(String prefixCode) {
        this.prefixCode = prefixCode;
    }
    public void setSuffixCode(String suffixCode) {
        this.suffixCode = suffixCode;
    }
    public Boolean getIsClearValue() {
        return isClearValue;
    }
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java
@@ -18,8 +18,10 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springblade.core.tenant.mp.TenantEntity;
import java.util.Date;
@@ -31,6 +33,8 @@
 */
@Data
@TableName("pl_org_user")
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class User extends TenantEntity {
@@ -119,4 +123,14 @@
     * è´¦å·æ˜¯å¦åœç”¨ 0为启用,1为停用
     */
    private Integer userStatus;
    public User(Integer userType, String account, String password, String name, String realName, Integer userStatus) {
        this.userType = userType;
        this.account = account;
        this.password = password;
        this.name = name;
        this.realName = realName;
        this.userStatus = userStatus;
    }
}
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/enums/UserStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.vci.ubcs.system.user.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author ludc
 * @date 2023/11/7 9:20
 */
@Getter
@AllArgsConstructor
public enum UserStatus {
    /**
     * å¯ç”¨
     */
    Enable("启用", 0),
    /**
     * åœç”¨
     */
    Deactivate("停用", 1),
    ;
    final String name;
    final int value;
    /**
     * åŒ¹é…æžšä¸¾å€¼
     *
     * @param name åç§°
     * @return BladeUserEnum
     */
    public static UserStatus of(String name) {
        if (name == null) {
            return null;
        }
        UserStatus[] values = UserStatus.values();
        for (UserStatus userStatus : values) {
            if (userStatus.name.equals(name)) {
                return userStatus;
            }
        }
        return null;
    }
}
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/feign/IUserClient.java
@@ -50,7 +50,9 @@
    String SAVE_USER = API_PREFIX + "/save-user";
    String SAVE_USER_LIST = API_PREFIX + "/save-user-list";
    String REMOVE_USER = API_PREFIX + "/remove-user";
    String UPDATE_STATUS_BY_ACCOUNT = API_PREFIX + "/update_status_by_account";
    String UPDATE_USER = API_PREFIX+"/update-user";
    String UPDATE_USER_BYACCOUNT = API_PREFIX+"/update-user-bt-account";
    String UPDATE_USER_STRATEGY_STATUS = API_PREFIX+"/update-user_strategy_status";
    /**
@@ -144,6 +146,24 @@
    R<Boolean> updateUser(@RequestBody User user);
    /**
     * æ›´æ”¹ç”¨æˆ·çŠ¶æ€
     * @param accounts
     * @param status
     * @return
     */
    @PostMapping(UPDATE_STATUS_BY_ACCOUNT)
    R<Boolean> updateStatusByAccount(@RequestParam("accounts") String accounts,@RequestParam("status") String status);
    /**
     * æ ¹æ®è´¦å·ä¿®æ”¹ç”¨æˆ·åŸºç¡€ä¿¡æ¯
     * @param oldAccount
     * @param newAccount
     * @return
     */
    @PostMapping(UPDATE_USER_BYACCOUNT)
    R<Boolean> updateUserByAccount(@RequestParam("oldAccount")String oldAccount,@RequestParam("newAccount") String newAccount);
    /**
     * ä¿®æ”¹ç”¨æˆ·å¯†ç ç­–略是否修改状态
     * @param userIds
     * @return
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/poi/util/ExcelUtil.java
@@ -524,6 +524,7 @@
                if (ed.isMerged() && (ed.getRowTo() > ed.getRow() || ed.getColTo() > ed.getCol())) {
                    mergedDataList.add(ed);
                }
                // TODO: ä¿®æ”¹ç¼–号列为文本
                if("id".equalsIgnoreCase(ed.getObjCode())){
                    //CellStyle textStyle = workbook.createCellStyle();
                    HSSFDataFormat format = (HSSFDataFormat)sheet.getWorkbook().createDataFormat();
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeBasicSecController.java
@@ -5,20 +5,15 @@
import com.vci.ubcs.code.dto.CodeBasicSecDTO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.dto.CodeRuleDTO;
import com.vci.ubcs.code.entity.CodeBasicSec;
import com.vci.ubcs.code.service.ICodeBasicSecService;
import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.code.wrapper.CodeBasicSecWrapper;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/IDockingSystemService.java
@@ -11,12 +11,14 @@
 * @date 2023-06-01
 */
public interface IDockingSystemService extends IService<DockingSystem> {
    /**
     * å¢žåŠ  ç³»ç»Ÿé›†æˆçš„系统信息
     * @param dockingSystemDTO ç³»ç»Ÿé›†æˆçš„系统信息数据传输对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    public boolean addSave(DockingSystemDTO dockingSystemDTO);
    boolean addSave(DockingSystemDTO dockingSystemDTO);
    /**
     * ä¿®æ”¹ ç³»ç»Ÿé›†æˆçš„系统信息
     * @param dockingSystemDTO ç³»ç»Ÿé›†æˆçš„系统信息数据传输对象
@@ -26,4 +28,5 @@
    boolean deleteDataById(String oids);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/DockingSystemServiceImpl.java
@@ -16,10 +16,17 @@
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.util.MdmBtmTypeConstant;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.system.user.entity.User;
import com.vci.ubcs.system.user.enums.UserEnum;
import com.vci.ubcs.system.user.enums.UserStatus;
import com.vci.ubcs.system.user.feign.IUserClient;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.*;
@@ -52,28 +59,54 @@
     */
    @Autowired
    private RevisionModelUtil revisionModelUtil;
    @Override
    public boolean addSave(DockingSystemDTO dockingSystemDTO) {
    /**
     * ç”¨æˆ·æœåŠ¡
     */
    @Autowired
    private IUserClient userClient;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean addSave(DockingSystemDTO dockingSystemDTO) {
        VciBaseUtil.alertNotNull(dockingSystemDTO, "需要添加的数据对象");
        //将DTO转换为DO
        DockingSystem dockingSystem = Objects.requireNonNull(BeanUtil.copy(dockingSystemDTO, DockingSystem.class));
        String userId = AuthUtil.getUserId().toString();
        DefaultAttrAssimtUtil.addDefaultAttrAssimt(dockingSystem, MdmBtmTypeConstant.SYS_INT_BASE);
        dockingSystem.setLctid(CODE_RULE_LC);
        dockingSystem.setLcStatus(FRAMEWORK_RELEASE_EDITING);
        return dockingSystemMapper.insert(dockingSystem)>0;
        boolean resInsert = dockingSystemMapper.insert(dockingSystem) > 0;
        if (!resInsert) {
            return false;
        }
        // ä¿å­˜ç”¨æˆ·
        User user = new User(
            UserEnum.WEB.getCategory(),
            dockingSystem.getId().toLowerCase(Locale.ROOT),
            Func.md5Hex(dockingSystem.getId()),
            dockingSystem.getName(),
            dockingSystem.getName(),
            UserStatus.Enable.getValue()
        );
        resInsert = userClient.saveUser(user).isSuccess();
        return resInsert;
    }
    /**
     * ä¿®æ”¹ ç³»ç»Ÿé›†æˆçš„系统信息
     * @param dockingSystemDTO ç³»ç»Ÿé›†æˆçš„系统信息数据传输对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public DockingSystemVO editSave(DockingSystemDTO dockingSystemDTO) {
        VciBaseUtil.alertNotNull(dockingSystemDTO,"数据对象",dockingSystemDTO.getOid(),"系统集成的系统信息主键");
        //将DTO转换为DO
        DockingSystem dockingSystem = dockingSystemMapper.selectById(dockingSystemDTO.getOid());
        // ç³»ç»Ÿç¼–号更改时账号也需要进行更改
        if(!dockingSystemDTO.getId().equals(dockingSystem.getId())){
            userClient.updateUserByAccount(dockingSystem.getId(),dockingSystemDTO.getId().toLowerCase(Locale.ROOT));
        }
        revisionModelUtil.copyFromDTOIgnore(dockingSystemDTO,dockingSystem);
        DefaultAttrAssimtUtil.updateDefaultAttrAssimt(dockingSystem);
        dockingSystemMapper.updateById(dockingSystem);
@@ -87,6 +120,7 @@
     * @throws VciBaseException
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteDataById(String oids) throws VciBaseException {
        String message="";
        try {
@@ -109,11 +143,15 @@
            if(errorMap.size()>0){
                throw  new Throwable(errorMap.getOrDefault("error",""));
            }
            return    dockingSystemMapper.deleteBatchIds(VciBaseUtil.str2List(oids))>0;
            // ä¿®æ”¹é›†æˆç³»ç»Ÿä¿¡æ¯ç®¡ç†çš„用户为删除状态用户
            String accounts = dockingSystemList.stream().map(DockingSystem::getId).collect(Collectors.joining(","));
            userClient.updateStatusByAccount(accounts,"1");
            return dockingSystemMapper.deleteBatchIds(VciBaseUtil.str2List(oids))>0;
        }catch (Throwable e){
            e.printStackTrace();
            throw  new VciBaseException(e.getMessage());
        }
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -3356,7 +3356,6 @@
        return getTableDefineByTemplateVO(templateService.getObjectHasAttrByOid(templateOid));
    }
    /**
     * ä½¿ç”¨æ¨¡æ¿æ˜¾ç¤ºå¯¹è±¡è½¬æ¢ä¸ºè¡¨æ ¼çš„信息(包含扩展的按钮)
     *
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -32,6 +32,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -451,7 +452,8 @@
                for (int j = 0; j < thisSecValueList.size(); j++) {
                    String secValue = thisSecValueList.get(j);
                    if (secValue.equalsIgnoreCase("${attr_" + attrSevVO.getOid() + "}")) {
                        thisSecValueList.set(j, value);
                        // TODO: å±žæ€§ç æ®µç”Ÿæˆç å€¼åŽï¼Œæ‹¼æŽ¥å‰åŽç¼€
                        thisSecValueList.set(j, joinPreffixAndSuffix(attrSevVO,value));
                    }
                }
                if (attrSevIsSerialDepend) {
@@ -535,7 +537,8 @@
                for (int z = 0; z < thisSecValueList.size(); z++) {
                    String secValue = thisSecValueList.get(z);
                    if (secValue.equalsIgnoreCase("${" + secVO.getOid() + "}")) {
                        thisSecValueList.set(z, serialString);
                        // TODO: æµæ°´ç”Ÿæˆç å€¼åŽæ‹¼æŽ¥å‰åŽç¼€
                        thisSecValueList.set(z, joinPreffixAndSuffix(secVO, serialString));
                    }
                }
                Map<String, Double> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
@@ -563,18 +566,19 @@
        String secValue = secValueMap.getOrDefault(secVO.getOid(), "");
        switch (secType) {
            case CODE_FIXED_SEC:
                secValue = joinPreffixAndSuffix(secVO, secValue);
                //固定码段的,直接用码值,不论码值的长度是多少,因为可变长度和固定长度是控制在码段管理里面的码值定义的
                break;
            case CODE_DATE_SEC:
                //时间码段,需要将当前时间依据时间格式进行转换.
                //时间码段不涉及到是否补位
                secValue = VciDateUtil.date2Str(new Date(), secVO.getCodeDateFormatStr());
                secValue =joinPreffixAndSuffix(secVO, VciDateUtil.date2Str(new Date(), secVO.getCodeDateFormatStr()));
                break;
            case CODE_CLASSIFY_SEC:
                //分类码段的,也是从前端选择了码值即可,不论码值的长度是多少
                CodeClassifyValue codeClassifyValueDO= codeClassifyValueMapper.selectById(secValue);
                if(codeClassifyValueDO!=null) {
                    secValue = codeClassifyValueDO.getId();
                    secValue = joinPreffixAndSuffix(secVO, codeClassifyValueDO.getId());
                }
                break;
            case CODE_LEVEL_SEC:
@@ -627,10 +631,12 @@
                        secValue = secValue.substring(secValue.length() - secVO.getValueCutLength());
                    }
                }
                secValue = joinPreffixAndSuffix(secVO,secValue);
                break;
            case CODE_REFER_SEC:
                //引用的在页面上已经选择了,所以直接使用前端上传递的值
                //引用就是参照,可能是其他的分类(业务类型)下的数据,所以只在页面上选择
                secValue = joinPreffixAndSuffix(secVO,secValue);
                break;
            case CODE_ATTR_SEC:
                //属性与引用的区别是,属性是当前数据里的属性,而引用可能是引用其他的分类的(业务类型)
@@ -645,6 +651,7 @@
                }
                OsCodeFillTypeEnum fillTypeEnum = OsCodeFillTypeEnum.forValue(secVO.getCodeFillType());
                secValue = fillString(VciBaseUtil.getInt(secVO.getCodeSecLength()), fillTypeEnum, secValue, secVO.getCodeFillSeparator());
                secValue = joinPreffixAndSuffix(secVO,secValue);
                break;
            case CODE_SERIAL_SEC:
                //流水码段
@@ -660,6 +667,27 @@
    }
    /**
     * æ‹¼æŽ¥å‰åŽç¼€
     * @param secVO
     * @param secValue
     * @return
     */
    private String joinPreffixAndSuffix(CodeBasicSecVO secVO, String secValue){
        StringBuilder joinSecValue = new StringBuilder();
        // æ‹¼æŽ¥å‰ç¼€
        if (Func.isNotEmpty(secVO.getPrefixCode())) {
            joinSecValue = joinSecValue.append(secVO.getPrefixCode());
        }
        // åœ¨ä¸­é—´æ‹¼æŽ¥å€¼
        joinSecValue.append(secValue);
        // æ‹¼æŽ¥åŽç¼€
        if(Func.isNotEmpty(secVO.getSuffixCode())){
            joinSecValue = joinSecValue.append(secVO.getSuffixCode());
        }
        return joinSecValue.toString();
    }
    /**
     * è¡¥ä½
     * @param totalLength æ€»é•¿åº¦
     * @param fillTypeEnum è¡¥ä½æ–¹å¼
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/feign/UserClient.java
@@ -102,6 +102,18 @@
    }
    @Override
    @PostMapping(UPDATE_STATUS_BY_ACCOUNT)
    public R<Boolean> updateStatusByAccount(@RequestParam String accounts,@RequestParam String status) {
        return R.data(service.updateStatusByAccount(accounts,status));
    }
    @Override
    @PostMapping(UPDATE_USER_BYACCOUNT)
    public R<Boolean> updateUserByAccount(String oldAccount, String newAccount) {
        return R.data(service.updateByAccount(oldAccount,newAccount));
    }
    @Override
    @PostMapping(UPDATE_USER_STRATEGY_STATUS)
    public R<Boolean> updateStrategyStatus(@RequestParam List<Long> userIds) {
        return R.data(service.updateByUseStrategyId(userIds));
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java
@@ -73,6 +73,22 @@
    boolean updateUserInfo(User user);
    /**
     * æ ¹æ®æ—§è´¦å·ï¼Œä¿®æ”¹ä¸ºæ–°è´¦å·å
     * @param oldAccount
     * @param newAccount
     * @return
     */
    boolean updateByAccount(String oldAccount,String newAccount);
    /**
     * æ®è´¦å·ï¼Œä¿®æ”¹ä¸ºç”¨æˆ·çŠ¶æ€
     * @param accounts
     * @param status
     * @return
     */
    boolean updateStatusByAccount(String accounts,String status);
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
     *
     * @param page
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java
@@ -20,6 +20,7 @@
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
@@ -35,6 +36,7 @@
import com.vci.ubcs.system.user.cache.UserCache;
import com.vci.ubcs.system.user.entity.*;
import com.vci.ubcs.system.user.enums.UserEnum;
import com.vci.ubcs.system.user.enums.UserStatus;
import com.vci.ubcs.system.user.excel.UserExcel;
import com.vci.ubcs.system.user.mapper.UserMapper;
import com.vci.ubcs.system.user.service.IUserDeptService;
@@ -91,6 +93,9 @@
        if (Func.isNotEmpty(user.getPassword())) {
            user.setPassword(DigestUtil.encrypt(user.getPassword()));
        }
        if(Func.isEmpty(user.getUserStatus())){
            user.setUserStatus(UserStatus.Enable.getValue());
        }
        Long userCount = baseMapper.selectCount(Wrappers.<User>query().lambda().eq(User::getTenantId, tenantId).eq(User::getAccount, user.getAccount()));
        if (userCount > 0L && Func.isEmpty(user.getId())) {
            throw new ServiceException(StringUtil.format("当前用户 [{}] å·²å­˜åœ¨!", user.getAccount()));
@@ -142,6 +147,36 @@
        return updateById(user);
    }
    /**
     * æ ¹æ®æ—§è´¦å·ï¼Œä¿®æ”¹ä¸ºæ–°è´¦å·å
     * @param oldAccount
     * @param newAccount
     * @return
     */
    @Override
    public boolean updateByAccount(String oldAccount,String newAccount) {
        User user = this.userByAccount(AuthUtil.getTenantId(), oldAccount);
        if(Func.isEmpty(user)){
            return true;
        }
        user.setAccount(newAccount);
        return this.updateUser(user);
    }
    /**
     * æ®è´¦å·ï¼Œä¿®æ”¹ä¸ºç”¨æˆ·çŠ¶æ€
     * @param accounts
     * @param status
     * @return
     */
    @Override
    public boolean updateStatusByAccount(String accounts, String status) {
        LambdaUpdateWrapper<User> updateWrapper = Wrappers.<User>update()
            .lambda().in(User::getAccount, accounts)
            .set(User::getUserStatus, status);
        return this.update(updateWrapper);
    }
    private boolean submitUserDept(User user) {
        List<Long> deptIdList = Func.toLongList(user.getDeptId());
        List<UserDept> userDeptList = new ArrayList<>();