ludc
2023-11-12 fa58b2d4afe13cd5aba50490b809c389f080f724
Merge remote-tracking branch 'origin/master'
已修改12个文件
已添加7个文件
670 ■■■■ 文件已修改
Source/UBCS-WEB/src/components/BatchImport/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/code.vue 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/PasswordManagement/passwords.vue 217 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeBasicSec.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeBasicSecVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeSerialAlgorithmVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UIFormItemVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/poi/util/ExcelUtil.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomSerialAlgorithmExample.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithmMethod.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeApplySwingController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSerialAlgorithmController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeSerialAlgorithmService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeBasicSecMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/BatchImport/index.vue
@@ -290,10 +290,12 @@
    },
    onError(err) {
      this.pageLoading.close();
      console.log('onError')
    },
    uploadChange(file) {
      if (file.status === "success" || file.status === "error") {
        this.pageLoading.close();
        console.log('uploadChange')
      }
    },
  },
Source/UBCS-WEB/src/views/code/code.vue
@@ -173,15 +173,15 @@
    <!-- ç¼–码规则,克隆对话框 -->
    <clone-rule-dialog
      :visible.sync="cloneSettingBox"
      :ruleData="selectionList[0]"
      :visible.sync="cloneSettingBox"
      @refreshRuleTable="onLoad">
    </clone-rule-dialog>
    <!-- ç¼–码规则,从其他规则克隆对话框 -->
    <clone-other-basic-sec-dialog
      :visible.sync="cloneOtherCodeRuleSettingBox"
      :quiltCloneCodeRule="selectionList[0]"
      :visible.sync="cloneOtherCodeRuleSettingBox"
      @refreshRuleTable="onLoad">
    </clone-other-basic-sec-dialog>
@@ -189,9 +189,9 @@
    <el-dialog
      :visible.sync="escapeOwnerVisible"
      append-to-body
      class="avue-dialog avue-dialog--top"
      title="转移所有者"
      width="30%"
      class= "avue-dialog avue-dialog--top"
    >
      <el-select v-model="ruleOwner" class="selects" placeholder="请选择">
        <el-option
@@ -256,7 +256,8 @@
            @click="openBasicDialog('edit', scope.row)"
            >编辑
          </el-button>
          <el-button v-if="basicPermissionList.basicMgrBtn && (scope.row.secType === 'codeclassifysec' || scope.row.secType == 'codefixedsec')"
          <el-button
            v-if="basicPermissionList.basicMgrBtn && (scope.row.secType === 'codeclassifysec' || scope.row.secType == 'codefixedsec')"
            icon="el-icon-setting"
            plain
            size="small"
@@ -879,10 +880,23 @@
                :label-width="rightFormLabelWidth"
                label="自定义的流水算法:"
              >
                <el-input
                  v-model="form.customCodeSerialClass"
                  :readonly="basicSecOnlyRead"
                ></el-input>
                  <template>
                      <vciWebRefer
                        ref="refer"
                        :referConfig="this.referConfig || {}"
                        :display="true"
                        :value="form.customCodeSerialClass"
                        :text="form.customCodeSerialClass"
                        @setReferValue="setReferValue"
                      ></vciWebRefer>
<!--                                    <el-input-->
<!--                                      v-model="form.customCodeSerialClass"-->
<!--                                      :readonly="basicSecOnlyRead"-->
<!--                                      @focus="streamFocusHandler"-->
<!--                                    ></el-input>-->
                  </template>
              </el-form-item>
            </div>
            <!-- å±‚级码段 -->
@@ -1147,9 +1161,10 @@
      <div slot="footer" class="dialog-footer">
        <el-button
          :disabled="!showbtn"
          type="primary"
          :loading="isLoadingSecCodeAddBtn"
          @click="saveOrEditBasicCode">保 å­˜</el-button>
          type="primary"
          @click="saveOrEditBasicCode">保 å­˜
        </el-button>
        <el-button @click="addBasicCodeSettingBox = false">取 æ¶ˆ</el-button>
      </div>
@@ -1246,11 +1261,13 @@
        </avue-crud>
        <div slot="footer" class="dialog-footer">
          <el-button type="primary" @click="saveSelectedParentClassify"
            >保 å­˜</el-button
          >保 å­˜
          </el-button
          >
          <el-button
            @click="parentClsfyParams.isShowParentClassifySettingBox = false"
            >取 æ¶ˆ</el-button
          >取 æ¶ˆ
          </el-button
          >
        </div>
      </el-dialog>
@@ -1271,6 +1288,10 @@
      >
      </refer-config-dialog>
    </el-dialog>
    <!--    è‡ªå®šä¹‰æµæ°´å‚照组件-->
  </basic-container>
</template>
@@ -1323,10 +1344,44 @@
import { getByRoleUserList } from "@/api/system/user";
import func from "@/util/func";
import secTypeEnum from '@/enumpack/CodeSecTypeEnum';
import vciWebRefer from "../../components/refer/vciWebRefer";
export default {
  components: { vciWebRefer },
  data() {
    return {
      referConfig:{
        title: '自定义流水参照',
        showField: 'customCodeSerialClass',
        field: 'customCodeSerialClass',
        fieldMap:  {},
        placeholder:'请选择自定义流水',
        options:   {
          // è®¾ç½®é»˜è®¤çš„属性
          url: 'api/ubcs-code/codeSerialAlgorithmController/gridCodeSerialAlgorithm',
          valueField:'classFullName',
          textField:'classFullName',
          isMuti: false,
          type: "grid",
          method: 'get',
          tableConfig: {
            page: {
              limit: 15,
              page: 1
            },
            cols: [
              {title: '算法编号', field: 'id', width: 200},
              {title: '算法名称', field: 'name', width: 150},
              {title: '类全路径', field: 'classFullName', width: 300},
              {title: '描述', field: 'description'}
            ],
            queryColumns: [
              // {field: 'id', title: '算法编号'},
              // {field: 'name', title: '算法名称'}
            ]
          }
        }
      },
      crudOption:{...optionRule},
      ruleForm: {},
      query: {},
@@ -1645,7 +1700,10 @@
    localStorage.removeItem('codeGetValueType');
  },
  methods: {
    //自定义流水失焦
    setReferValue(data){
      console.log(data)
    },
    /** è½¬ç§»è§„则所有者对话框 */
    escapeOwner() {
      if (this.selectionList.length === 0) {
Source/UBCS-WEB/src/views/system/PasswordManagement/passwords.vue
@@ -42,85 +42,11 @@
export default {
  name: "passwords.vue",
  data() {
    // æœ€å°é•¿åº¦æ­£åˆ™ç»‘定值
    let validatePass=""
    //最大长度正则绑定值
    let validatePass1=""
    //过期时间正则绑定值
    let validatePass2=""
    //提醒时间正则绑定值
    let validatePass3=""
    //锁定次数正则绑定值
    let validatePass4=""
    //锁定时间正则绑定值
    let validatePass5=""
    //最小长度绑定value
    let values=""
    //最大长度绑定value
    let values1=""
    //最小长度正则方法
    validatePass = (rule, value,callback) => {
     values=value*1
      if(value == ""){
        callback(new Error('请输入密码最小长度'));
      // }else if(values >= values1*1){
      //   callback(new Error('密码最小长度不能大于密码最大长度'));
      }else if(/[^\d]/g.test(value)){
        callback(new Error('密码最小长度的输入类型只能为数字类型'));
      }else {
        callback();
      }
    };
    //最大长度正则方法
    validatePass1= (rule, value,callback) =>{
      values1=value*1
     if(value == ""){
        callback(new Error('请输入密码最大长度'));
      }else if(values1 <= values){
       callback(new Error('密码最大长度不能小于密码最大长度'));
     }else if(/[^\d]/g.test(value)){
       callback(new Error('密码最大长度的输入类型只能为数字类型'));
     }else {
       callback();
     }
    };
    validatePass2 = (rule, value,callback) => {
      if(value == ""){
        callback(new Error('请输入过期时间'));
      }else if(/[^\d]/g.test(value)){
        callback(new Error('过期时间的输入类型只能为数字类型'));
      }else {
        callback();
      }
    };
    validatePass3 = (rule, value,callback) => {
      if(value == ""){
        callback(new Error('请输入过期时间'));
      }else if(/[^\d]/g.test(value)){
        callback(new Error('过期时间的输入类型只能为数字类型'));
      }else {
        callback();
      }
    };
    validatePass4 = (rule, value,callback) => {
      if(value == ""){
        callback(new Error('请输入锁定次数'));
      }else if(/[^\d]/g.test(value)){
        callback(new Error('锁定次数的输入类型只能为数字类型'));
      }else {
        callback();
      }
    };
    validatePass5 = (rule, value,callback) => {
      if(value == ""){
        callback(new Error('请输入锁定时间'));
      }else if(/[^\d]/g.test(value)){
        callback(new Error('锁定时间的输入类型只能为数字类型'));
      }else {
        callback();
      }
    };
    return {
      //最小长度绑定value
      values:"",
      //最大长度绑定value
      values1:"",
      form:{},
      page: {
        pageSize: 10,
@@ -195,7 +121,18 @@
              labelWidth:"22%",
              rules: [{
                required: true,
                validator:this.validatePass,
                validator:(rule, value,callback)=>{
                  this.values=value*1
                  if(value == ""){
                    callback(new Error('请输入密码最小长度'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('密码最小长度的输入类型只能为数字类型'));
                  }else if(this.values >= this.values1 && this.values1 != 0){
                    callback(new Error('密码最小长度不能大于密码最大长度'))
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
@@ -206,7 +143,18 @@
              labelWidth:"25%",
              rules: [{
                required: true,
                validator:this.validatePass1,
                validator:(rule, value,callback) =>{
                  this.values1=value*1
                  if(value == ""){
                    callback(new Error('请输入密码最大长度'));
                  }else if(this.values1 <= this.values){
                    callback(new Error('密码最大长度不能小于密码最大长度'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('密码最大长度的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'change'
              }]
            },
@@ -280,7 +228,15 @@
              labelWidth:"22%",
              rules: [{
                required: true,
                validator:this.validatePass2,
                validator: (rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入过期时间'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('过期时间的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
@@ -291,7 +247,15 @@
              labelWidth:"25%",
              rules: [{
                required: true,
                validator:this.validatePass3,
                validator:(rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入过期时间'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('过期时间的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
@@ -302,7 +266,15 @@
              labelWidth:"22%",
              rules: [{
                required: true,
                validator:this.validatePass4,
                validator:(rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入锁定次数'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('锁定次数的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
@@ -313,7 +285,15 @@
              labelWidth:"25%",
              rules: [{
                required: true,
                validator:this.validatePass5,
                validator:(rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入锁定时间'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('锁定时间的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
@@ -350,41 +330,72 @@
      this.selectlength=val
    },
    handleCheckboxChange(val) {
      // console.log("val",val);
      const arr = this.option.column[5];
      if(val){
        this.checkboxlength = val.value;
        return
      }
      // console.log("this.checkboxlength",this.checkboxlength);
      this.checkboxedit = this.checkboxlength.toString().split(",");
      if (val.value != undefined && val.value != null) {
        if (this.checkboxlist == val.value) {
      if (val.value !== undefined && val.value !== null) {
        if (this.checkboxlist === val.value) {
          return;
        } else {
          this.checkboxlist = val.value;
          if (
            this.selectlength.value >= val.value.length &&
            this.selectlength.value > val.value.length &&
            val.value.length > 0
          ) {
            this.showMessage("必填种类不能大于组合方法,请重新选择!");
            this.showWarningMessage();
          } else if (
            this.selectlength.value >= this.checkboxedit.length &&
            this.selectlength.value > this.checkboxedit.length &&
            this.checkboxedit.length > 0
          ) {
            this.showMessage("必填种类不能大于组合方法,请重新选择!");
            this.showWarningMessage();
          }
        }
      }
      const disabledCount = Math.min(this.checkboxedit.length, 4);
      for (let i = 0; i < arr.dicData.length; i++) {
        arr.dicData[i].disabled = i >= disabledCount;
      if (val.value !== undefined && val.value !== null) {
        if (val.value.length === 1) {
          this.setDisabled(arr, [0]);
        } else if (val.value.length === 2) {
          this.setDisabled(arr, [0, 1]);
        } else if (val.value.length === 3) {
          this.setDisabled(arr, [0, 1, 2]);
        } else if (val.value.length === 4) {
          this.setDisabled(arr, [0, 1, 2, 3]);
        } else if (val.value.length === 0) {
          this.setDisabled(arr, [-1]);
      }
      if (this.editFlag == true) {
        const disabledCount = Math.min(this.checkboxedit.length, 4);
        for (let i = 0; i < arr.dicData.length; i++) {
          arr.dicData[i].disabled = i >= disabledCount;
      } else if (this.checkboxNumber.length !== 0) {
        this.setDisabled(arr, [0, 1, 2, 3]);
      }
      if (this.editFlag) {
        if (this.checkboxedit.length === 1) {
          this.setDisabled(arr, [0]);
        } else if (this.checkboxedit.length === 2) {
          this.setDisabled(arr, [0, 1]);
        } else if (this.checkboxedit.length === 3) {
          this.setDisabled(arr, [0, 1, 2]);
        } else if (this.checkboxedit.length === 4) {
          this.setDisabled(arr, [0, 1, 2, 3]);
        } else if (this.checkboxedit.length === 0) {
          this.setDisabled(arr, [-1]);
        }
      }
    },
    setDisabled(arr, indices) {
      arr.dicData.forEach((item, index) => {
        item.disabled = !indices.includes(index);
      });
    },
    showWarningMessage() {
      this.$message({
        message: '必填种类不能大于组合方法,请重新选择!',
        type: 'warning',
        showClose: true,
      });
    },
    rowDel(row){
      this.$confirm("确定将选择数据删除?", {
@@ -432,7 +443,7 @@
      this.editFlag=true;
      this.checkboxNumber=row.combinationIds.split(",")
      this.selectNumber=row.requiredType
        if(this.checkboxNumber.length<=this.selectNumber){
        if(this.checkboxNumber.length < this.selectNumber){
          this.$message({
            type:"warning",
            message:"必填种类不能大于组合方法,请重新选择!"
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java
@@ -193,6 +193,11 @@
    private String customCodeSerialClass;
    /**
     * è‡ªå®šä¹‰çš„æµæ°´ç®—法类
     */
    private String customCodeSerialClassText;
    /**
     * æ˜¯å¦è‡ªåŠ¨åŒ¹é…åˆ†ç±»å€¼
     */
    private String matchClassifyValueFlag;
@@ -661,6 +666,14 @@
        this.referCodeClassifyOidName = referCodeClassifyOidName;
    }
    public String getCustomCodeSerialClassText() {
        return customCodeSerialClassText;
    }
    public void setCustomCodeSerialClassText(String customCodeSerialClassText) {
        this.customCodeSerialClassText = customCodeSerialClassText;
    }
    @Override
    public String toString() {
        return "CodeBasicSecDTO{" +
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeBasicSec.java
@@ -237,6 +237,12 @@
     */
    private String customCodeSerialClass;
    /**
     * è‡ªå®šä¹‰çš„æµæ°´ç®—法类
     */
    private String customCodeSerialClassText;
    /**
     * æ˜¯å¦è‡ªåŠ¨åŒ¹é…åˆ†ç±»å€¼
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeBasicSecVO.java
@@ -200,6 +200,11 @@
    private String customCodeSerialClass;
    /**
     * è‡ªå®šä¹‰çš„æµæ°´ç®—法类
     */
    private String customCodeSerialClassText;
    /**
     * æ˜¯å¦è‡ªåŠ¨åŒ¹é…åˆ†ç±»å€¼
     */
    private String matchClassifyValueFlag;
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeSerialAlgorithmVO.java
@@ -1,11 +1,13 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * æµæ°´ç®—法类的显示信息
 * @author weidy
 * @date 2022-2-17
 */
public class CodeSerialAlgorithmVO implements java.io.Serializable{
public class CodeSerialAlgorithmVO extends BaseModel {
    /**
     * ç®—法编号
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UIFormItemVO.java
@@ -3,6 +3,7 @@
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -136,6 +137,10 @@
     * è¾“入提示
     */
    private String inputTip;
    /**
     * å…¶å®ƒå±žæ€§éƒ½å¯ä»¥å¾€é‡Œé¢æ”¾
     */
    private Map<String, String> addField = new HashMap<>();
    public boolean isKeyAttr() {
        return keyAttr;
@@ -329,6 +334,14 @@
        this.selectLibFlag = selectLibFlag;
    }
    public Map<String, String> getAddField() {
        return addField;
    }
    public void setAddField(Map<String, String> addField) {
        this.addField = addField;
    }
    @Override
    public String toString() {
        return "UIFormItemVO{" +
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/poi/util/ExcelUtil.java
@@ -943,7 +943,7 @@
                                    Map<Integer, String> rowDataMap = new HashMap();
                                    for(int columnIndex = 0; columnIndex < rowDataSet.getLastCellNum(); ++columnIndex) {
                                    for(int columnIndex = 0; columnIndex < sheetDataSet.getColName().size(); ++columnIndex) {
                                        Cell cell = rowDataSet.getCell(columnIndex);
                                        Object value = getCellValue(cell, evaluator);
                                        String title = colsNameIndexMap.containsKey(columnIndex) ? (String)colsNameIndexMap.get(columnIndex) : "";
@@ -1025,7 +1025,8 @@
                                            } else {
                                                rowDataMap.put(columnIndex, VciBaseUtil.getStringValueFromObject(value));
                                            }
                                        } else if (!isDataSet && thisField != null && excelColumn != null) {
                                        } else {
                                            if (!isDataSet && thisField != null && excelColumn != null) {
                                            if (!excelColumn.nullable()) {
                                                throw new VciBaseException("cellValueCanNotNull", new String[]{title, rowIndex + 1 + ""});
                                            }
@@ -1034,6 +1035,8 @@
                                                throw new VciBaseException("cellValueCanNotNullForReg", new String[]{title, rowIndex + 1 + ""});
                                            }
                                        }
                                            rowDataMap.put(columnIndex, VciBaseUtil.getStringValueFromObject(value));
                                        }
                                    }
                                    if (isDataSet) {
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
@@ -1438,7 +1438,61 @@
        return sb.toString();
    }
    public static String intToRomans(int num) {
    public static String convertArabicToRoman(int num) {
        int[] values={1000,900,500,400,100,90,50,40,10,9,5,4,1};
        String[] romans={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<values.length;i++){
            while(num>=values[i]){
                num=num-values[i];
                sb.append(romans[i]);
            }
        }
        return sb.toString();
    }
    /**
     * æŠŠç½—马数字转换为阿拉伯数字
     * @param m
     * @return
     */
    public static int convertRomanToArabic(String m) {
        int graph[] = new int[400];
        graph['I'] = 1;
        graph['V'] = 5;
        graph['X'] = 10;
        graph['L'] = 50;
        graph['C'] = 100;
        graph['D'] = 500;
        graph['M'] = 1000;
        char[] num = m.toCharArray();
        int sum = graph[num[0]];
        for (int i = 0; i < num.length - 1; i++) {
            if (graph[num[i]] >= graph[num[i + 1]]) {
                sum += graph[num[i + 1]];
            } else {
                sum = sum + graph[num[i + 1]] - 2 * graph[num[i]];
            }
        }
        return sum;
    }
    /***
     * æ ¡éªŒæ˜¯å¦æ˜¯ç½—马数字
     * @param s
     * @return
     */
    public static boolean isRoman(String s) {
        // æ£€æŸ¥è¾“入的字符串是否为空
        if (s == null || s.length() == 0) {
            return false;
        }
        // å°†è¾“入的字符串转换为大写字母
        s = s.toUpperCase();
        // è¿”回结果
        Pattern pattern = Pattern.compile("^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$");
        return pattern.matcher(s ).matches();
    }
    public static String intToRomanTwo(int num) {
        String M[] = {"", "M", "MM", "MMM"};
        String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.vci.ubcs.code.algorithm;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithm;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithmMethod;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import java.util.List;
/****
 * è‡ªå®šä¹‰ç½—马流水算法自定义类
 */
@MdmSerialAlgorithm(text = "自定义罗马流水",description = "自定义罗马流水算法")
public class CustomRomanSerialAlgorithmExample {
    /**
     * ç”Ÿæˆç½—马流水号的方法
     * @return æµæ°´å·çš„信息
     */
    @MdmSerialAlgorithmMethod
    public String serialGenerate(BaseModel data, CodeRuleVO codeRuleVO, List<CodeOrderSecDTO> secDTOList){
        //将数字流水转为罗马流水
        String romanValue=VciBaseUtil.convertArabicToRoman(5);
        //将罗马流水转为数字流水
        int arabicValue=VciBaseUtil.convertRomanToArabic(romanValue);
        return "";
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomSerialAlgorithmExample.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.vci.ubcs.code.algorithm;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithm;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithmMethod;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.List;
/**
 * æµæ°´ç®—法的示例
 */
@MdmSerialAlgorithm(text = "流水算法的示例",description = "请不要使用这个类,这个类只是示例,用于查看如何编写流水算法")
public class CustomSerialAlgorithmExample {
    /**
     * ç”Ÿæˆæµæ°´å·çš„æ–¹æ³•
     * @return æµæ°´å·çš„信息
     */
    @MdmSerialAlgorithmMethod
    public String serialGenerate(BaseModel data, CodeRuleVO codeRuleVO, List<CodeOrderSecDTO> secDTOList){
        return "";
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.vci.ubcs.code.annotation;
import org.springframework.stereotype.Component;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * è‡ªå®šä¹‰æµæ°´ç®—法的注解
 *    @author xiejun
  * @date 2023-11-09
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface MdmSerialAlgorithm {
    /**
     * å€¼ï¼Œå®žé™…就是这个注解所在的类的全路径
     * @return å€¼
     */
    String value() default "";
    /**
     * äº‹ä»¶çš„名称
     * @return äº‹ä»¶åç§°
     */
    String text();
    /**
     * æè¿°
     * @return æè¿°
     */
    String description() default "";
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithmMethod.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.vci.ubcs.code.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * è‡ªå®šä¹‰æµæ°´ç®—法处理方法的注解
 * @author xiejun
 * @date 2023-11-09
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MdmSerialAlgorithmMethod {
    /**
     * å€¼
     * @return å€¼
     */
    String value() default "";
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeApplySwingController.java
@@ -83,13 +83,19 @@
    /**
     * ä½¿ç”¨æ¨¡æ¿çš„主键获取表单的定义
     * @param codeClassifyOid ä½¿ç”¨æ¨¡æ¿çš„分类主键
     * @param map ä¼ çš„æ•°æ®
     * @return UI相关的信息(仅包含表单)
     */
    @GetMapping("/getFormDefineByTemplateOid")
    public MdmUIInfoVO getFormDefineByTemplateOid(String codeClassifyOid){
        CodeClassifyTemplateVO usedTemplateByClassifyOid = mdmEngineService.getUsedTemplateByClassifyOid(codeClassifyOid);
        return mdmEngineService.getFormDefineByTemplateOid(usedTemplateByClassifyOid.getOid(),codeClassifyOid);
    @RequestMapping("/getFormDefineByTemplateOid")
    public MdmUIInfoVO getFormDefineByTemplateOid(@RequestParam Map<String,String> map){
//        CodeClassifyTemplateVO usedTemplateByClassifyOid = mdmEngineService.getUsedTemplateByClassifyOid(codeClassifyOid);
        CodeClassifyTemplateVO usedTemplateByClassifyOid = mdmEngineService.getUsedTemplateByClassifyOid(map.get("codeClassifyOid"));
        MdmUIInfoVO formDefineByTemplate = mdmEngineService.getFormDefineByTemplateOid(usedTemplateByClassifyOid.getOid(), map.get("codeClassifyOid"));
        for (UIFormItemVO item : formDefineByTemplate.getFormDefineVO().getItems()) {
            if(map.get(item.getField()) != null){
                item.getAddField().put("defaultValue",map.get(item.getField()));
            }
        }return formDefineByTemplate;
    }
    /**
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSerialAlgorithmController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.vci.ubcs.code.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.code.vo.pagemodel.CodeAllCodeVO;
import com.vci.ubcs.code.vo.pagemodel.CodeSerialAlgorithmVO;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.vci.ubcs.code.service.ICodeSerialAlgorithmService;
/**
 * å…¨éƒ¨ç å€¼ æŽ§åˆ¶å™¨
 *
 * @author ludc
 * @since 2023-04-03
 */
@RestController
@AllArgsConstructor
@RequestMapping("/codeSerialAlgorithmController")
@Api(value = "自定义流水", tags = "自定义流水算法")
public class CodeSerialAlgorithmController extends BladeController {
    /**
     * ç®—法服务
     */
    @Autowired
    private ICodeSerialAlgorithmService algorithmService;
    /**
     * ç®—法的列表
     * @return ç®—法的信息
     */
    @GetMapping("/gridCodeSerialAlgorithm")
    public R<IPage<CodeSerialAlgorithmVO>> gridCodeSerialAlgorithm(){
        IPage<CodeSerialAlgorithmVO> pages= algorithmService.gridSerialAlgorithm();
        return R.data(pages);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeSerialAlgorithmService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.vci.ubcs.code.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.code.vo.pagemodel.CodeSerialAlgorithmVO;
import org.springblade.core.tool.api.R;
/**
 * æµæ°´ç®—法类
 * @author weidy
 * @date 2022-2-17
 */
public interface ICodeSerialAlgorithmService {
    /**
     * èŽ·å–æµæ°´ç®—æ³•çš„åˆ—è¡¨
     * @return æµæ°´ç®—法的信息
     */
    IPage<CodeSerialAlgorithmVO>  gridSerialAlgorithm();
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.vci.ubcs.code.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithm;
import com.vci.ubcs.code.service.ICodeSerialAlgorithmService;
import com.vci.ubcs.code.vo.pagemodel.CodeSerialAlgorithmVO;
import com.vci.ubcs.starter.web.util.ApplicationContextProvider;
import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springframework.aop.framework.Advised;
import org.springframework.aop.support.AopUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * æµæ°´ç®—法的服务
 * @author weidy
 * @date 2022-2-17
 */
@Service
public class CodeSerialAlgorithmServiceImpl implements ICodeSerialAlgorithmService {
    /**
     * èŽ·å–æµæ°´ç®—æ³•çš„åˆ—è¡¨
     *
     * @return æµæ°´ç®—法的信息
     */
    @Override
    public IPage<CodeSerialAlgorithmVO> gridSerialAlgorithm() {
        //使用主键去扫描
        String[] beanNames = ApplicationContextProvider.getApplicationContext().getBeanNamesForAnnotation(MdmSerialAlgorithm.class);
        List<CodeSerialAlgorithmVO> voList = new ArrayList<>();
        if(beanNames!=null && beanNames.length>0){
            for(String beanName : beanNames){
                Object bean = ApplicationContextProvider.getApplicationContext().getBean(beanName);
                if(bean!=null){
                    CodeSerialAlgorithmVO algorithmVO = new CodeSerialAlgorithmVO();
                    //Advised advised = (Advised)bean;
                    Class<?> targetClass = AopUtils.getTargetClass(bean);
                    //Class<?> targetClass = advised.getTargetSource().getTargetClass();
                    algorithmVO.setClassFullName(targetClass.getName());
                    MdmSerialAlgorithm serialAlgorithm = targetClass.getDeclaredAnnotation(MdmSerialAlgorithm.class);
                    if(serialAlgorithm==null){
                        serialAlgorithm = targetClass.getAnnotation(MdmSerialAlgorithm.class);
                    }
                    if(serialAlgorithm !=null) {
                        algorithmVO.setName(serialAlgorithm.text());
                        algorithmVO.setDescription(serialAlgorithm.description());
                        algorithmVO.setId(serialAlgorithm.value());
                        if(StringUtils.isBlank(algorithmVO.getId())){
                            algorithmVO.setId(beanName);
                        }
                        voList.add(algorithmVO);
                    }
                }
            }
        }
        Query query=new Query();
        IPage<CodeSerialAlgorithmVO> queryIPage =Condition.getPage(query);
        queryIPage.setRecords(voList);
        return queryIPage;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeBasicSecMapper.xml
@@ -55,6 +55,7 @@
        <result property="codeFillLimit" column="CODEFILLLIMIT" jdbcType="INTEGER"/>
        <result property="codeFillFlag" column="CODEFILLFLAG" jdbcType="VARCHAR"/>
        <result property="customCodeSerialClass" column="CUSTOMCODESERIALCLASS" jdbcType="VARCHAR"/>
        <result property="customCodeSerialClassText" column="CUSTOMCODESERIALCLASSTEXT" jdbcType="VARCHAR"/>
        <result property="matchClassifyValueFlag" column="MATCHCLASSIFYVALUEFLAG" jdbcType="VARCHAR"/>
        <result property="parentClassifySecOid" column="PARENTCLASSIFYSECOID" jdbcType="VARCHAR"/>
        <result property="parentClassifySecText" column="b__name" jdbcType="VARCHAR"/>
@@ -123,6 +124,7 @@
            PL_CODE_BASICSEC.codelevelvalue,
            PL_CODE_BASICSEC.codefilllength,
            PL_CODE_BASICSEC.customcodeserialclass,
            PL_CODE_BASICSEC.customCodeSerialClassText,
            PL_CODE_BASICSEC.matchclassifyvalueflag,
            PL_CODE_BASICSEC.sectype,
            PL_CODE_BASICSEC.pkcoderule,