From abe9f2de85ff402a4c989dbc1427807b4e3a59f4 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期四, 06 七月 2023 13:56:17 +0800
Subject: [PATCH] 代码提交

---
 Source/UBCS-WEB/.gitignore                                                                              |    2 
 Source/UBCS-WEB/src/components/Tree/classifyTrees.vue                                                   |   68 ----
 Source/UBCS-WEB/src/views/code/code.vue                                                                 |   10 
 Source/UBCS-WEB/src/components/template/SetPersonnel.vue                                                |    2 
 Source/UBCS/ubcs-ops/ubcs-report/src/main/java/com/vci/ubcs/report/config/BladeReportConfiguration.java |    2 
 Source/UBCS-WEB/src/components/Tree/classifyTreeform.vue                                                |  148 ++++++++--
 Source/UBCS-WEB/src/api/template/templateAttr.js                                                        |   10 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILifeCycleService.java         |   17 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/LifeCycleController.java    |   35 ++
 Source/UBCS-WEB/src/api/MasterData/master.js                                                            |    9 
 Source/UBCS-WEB/src/components/Crud/VciMasterCrud.vue                                                   |    6 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java |  294 ++++++++++++++++++++
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java           |   19 +
 Source/UBCS-WEB/src/components/Tree/attrCrud.vue                                                        |  119 ++++----
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java   |   48 +++
 15 files changed, 599 insertions(+), 190 deletions(-)

diff --git a/Source/UBCS-WEB/.gitignore b/Source/UBCS-WEB/.gitignore
index fdd7d45..38bac29 100644
--- a/Source/UBCS-WEB/.gitignore
+++ b/Source/UBCS-WEB/.gitignore
@@ -1,7 +1,7 @@
 .DS_Store
 node_modules
 # /dist
-
+/vue.config/
 /tests/e2e/videos/
 /tests/e2e/screenshots/
 
diff --git a/Source/UBCS-WEB/src/api/MasterData/master.js b/Source/UBCS-WEB/src/api/MasterData/master.js
index ac79efc..8cda791 100644
--- a/Source/UBCS-WEB/src/api/MasterData/master.js
+++ b/Source/UBCS-WEB/src/api/MasterData/master.js
@@ -19,3 +19,12 @@
     }
   })
 }
+export const referDataGrid = (params) => {
+  return request({
+    url: '/api/ubcs-code/referBtmTypeController/referDataGrid',
+    method: 'get',
+    params:{
+      ...params
+    }
+  })
+}
diff --git a/Source/UBCS-WEB/src/api/template/templateAttr.js b/Source/UBCS-WEB/src/api/template/templateAttr.js
index 238a09d..29dd2e5 100644
--- a/Source/UBCS-WEB/src/api/template/templateAttr.js
+++ b/Source/UBCS-WEB/src/api/template/templateAttr.js
@@ -182,3 +182,13 @@
     }
   })
 }
+//鏃堕棿鏍煎紡涓嬫媺鑿滃崟
+export const  listByFlag = (params) =>{
+  return request({
+    url:'/api/ubcs-code/bdSelectInputController/listByFlag',
+    method: 'get',
+    params:{
+      ...params
+    }
+  })
+}
diff --git a/Source/UBCS-WEB/src/components/Crud/VciMasterCrud.vue b/Source/UBCS-WEB/src/components/Crud/VciMasterCrud.vue
index c40df95..2c7f374 100644
--- a/Source/UBCS-WEB/src/components/Crud/VciMasterCrud.vue
+++ b/Source/UBCS-WEB/src/components/Crud/VciMasterCrud.vue
@@ -199,7 +199,9 @@
         code: "",
         type: "PUBLIC",
         template: "",
-        codeClassifyOid:""
+        vars:{
+          codeClassifyOid:""
+        }
       },
       visibleFlow: false,
       transferData: [],
@@ -259,7 +261,7 @@
     codeClassifyOid: {
       handler(newval, oldval) {
         this.codeClassifyOid = newval;
-        this.parameter.codeClassifyOid=newval
+        this.parameter.vars.codeClassifyOid=newval
       },
       deep: true,
     },
diff --git a/Source/UBCS-WEB/src/components/Tree/attrCrud.vue b/Source/UBCS-WEB/src/components/Tree/attrCrud.vue
index 1909549..257dd8b 100644
--- a/Source/UBCS-WEB/src/components/Tree/attrCrud.vue
+++ b/Source/UBCS-WEB/src/components/Tree/attrCrud.vue
@@ -1,7 +1,6 @@
 <template>
   <div>
     <div style="display: flex;flex-wrap: wrap;" v-if="this.crudArrayFlag">
-      <el-button-group>
       <!--鏂板-->
       <el-button v-if="attrEditVisible == false && attrFlagChiledren==false" size="small" type="primary" icon="el-icon-plus" @click="busineHandle">娣诲姞 {{ msg }}</el-button>
       <!--        鍏ㄥ睆缂栬緫-->
@@ -10,9 +9,6 @@
       <el-button icon="el-icon-info" size="small" @click="rulesVisible=true">楠岃瘉瑙勫垯</el-button>
       <!--        灞炴�у垎缁�-->
       <el-button icon="el-icon-menu" size="small" @click="attrVisibleHandle">灞炴�у垎缁�</el-button>
-      </el-button-group>
-      <el-button-group>
-<<<<<<< HEAD
         <!--        鍒嗙被娉ㄥ叆-->
         <el-button icon="el-icon-magic-stick" size="small" @click="injectBtn">鍒嗙被娉ㄥ叆</el-button>
           <!--    缁勫悎瑙勫垯-->
@@ -23,7 +19,6 @@
         <el-button size="small" @click="CascadeHandle">绾ц仈灞炴��</el-button>
         <!--    棰勮鎺掑簭-->
         <el-button size="small" icon="el-icon-arrow-down">棰勮鎺掑簭</el-button>
-=======
       <!--        鍒嗙被娉ㄥ叆-->
       <el-button icon="el-icon-magic-stick" size="small" @click="injectBtn">鍒嗙被娉ㄥ叆</el-button>
         <!--    缁勫悎瑙勫垯-->
@@ -34,8 +29,6 @@
       <el-button size="small" @click="CascadeHandle">绾ц仈灞炴��</el-button>
       <!--    棰勮鎺掑簭-->
       <el-button size="small" @click="orderHandle" icon="el-icon-arrow-down">棰勮鎺掑簭</el-button>
->>>>>>> 92e7dde00a56aff46e01efe72e1f7ab9b76dcf69
-      </el-button-group>
       <!--    淇濆瓨-->
       <el-button size="small" @click="addsHandler" icon="el-icon-check">淇濆瓨</el-button>
       <!--    鍒犻櫎-->
@@ -248,7 +241,6 @@
               @select="selectHandle"
               @selection-change="selectionChange"
               v-if="this.crudArrayFlag"
-              ref="referAttrCrud"
     >
       <el-table-column
         type="selection"
@@ -259,26 +251,32 @@
                        :label="item.label"
                        :prop="item.prop"
                        :formatter="formAttr"
-                       :width="item.width||(item.label.length >=4 ?'150':item.label.length==3 ?'120':'90')"
+                       :width="item.width||(item.label.length >=4 ?'160':item.label.length==3 ?'130':'100')"
                        :show-overflow-tooltip="true"
+                       :sortable="item.sortable"
                        align="center"
       >
         <template slot-scope="{ row }">
-          <el-input v-if="editingRows === row && editShows== item.prop && (item.edit == 'text' || item.edit == 'select' ||item.edit == 'refer')" v-model="row[item.prop]"
+          <el-input v-if="editingRows === row && editShows== item.prop && item.prop != 'codeDateFormat' && (item.edit == 'text' || item.edit == 'select' ||item.edit == 'refer' )" v-model="row[item.prop]"
                     @blur="saveRows"></el-input>
-          <el-input-number size="small" controls-position="right" v-if="editingRows === row && editShows== item.prop && item.edit == 'number'" v-model="row[item.prop]"
-                           @blur="saveRows" :style="{width:(item.width-10)+'px'}"></el-input-number>
+          <el-input-number controls-position="right" v-if="editingRows === row && editShows== item.prop && item.edit == 'number'" v-model="row[item.prop]"
+                           @blur="saveRows"></el-input-number>
+          <el-select v-model="row[item.prop]" slot="prepend" v-if="editingRows === row && editShows== item.prop && item.prop == 'codeDateFormat'  && row[item.prop] ==''" @focus="DataChangeHandler">
+            <el-option label="椁愬巺鍚�" value="1"></el-option>
+            <el-option label="璁㈠崟鍙�" value="2"></el-option>
+            <el-option label="鐢ㄦ埛鐢佃瘽" value="3"></el-option>
+          </el-select>
           <el-switch
             v-if="item.edit === 'switch'" v-model="row[item.prop]" active-value="true"
             inactive-value="false">
           </el-switch>
-          <span v-else>{{ row[item.prop] }}</span>
+          <span v-else >{{ row[item.prop] }}</span>
         </template>
       </el-table-column>
       <el-table-column
         fixed="right"
         label="鎿嶄綔"
-        width="70">
+        width="120">
         <template slot-scope="scope">
           <el-button
             size="small"
@@ -290,11 +288,10 @@
       </el-table-column>
     </el-table>
   </div>
-  <!--  </avue-crud>-->
 </template>
 
 <script>
-import {AttrByBtm, gridCodeClassifyTemplateAttr, batchAddSave, copyto} from '@/api/template/templateAttr'
+import {AttrByBtm, gridCodeClassifyTemplateAttr, batchAddSave, copyto,listByFlag} from '@/api/template/templateAttr'
 
 export default {
   name: "attrCrud .vue",
@@ -451,6 +448,8 @@
       isShowformulaEdit: false,
       // 绾ц仈鍗曢��
       selectRow: '',
+      //绾ц仈鍗曢�夋暟缁�
+      selectRowArr:[],
       // 绾ц仈data
       CascadeData: [],
       // 绾ц仈option
@@ -1005,7 +1004,7 @@
           label: '鎺掑簭鍙�',
           sortable: true,
           edit: 'number',
-          width: 100,
+          width: 90,
           fixed: true
         }, {
             label: "灞炴�ц嫳鏂囩紪鍙�",
@@ -1021,7 +1020,7 @@
             prop: "name",
             fixed: true,
             cell: false,
-            width: 125,
+            width: 145,
             edit: 'text',
             sortable: true
           },
@@ -1151,7 +1150,7 @@
             label: "鏃堕棿鏍煎紡",
             prop: "codeDateFormat",
             sortable: true,
-            width: 105,
+            width: 135,
             edit: 'select',
             cell: false,
           },
@@ -1266,7 +1265,9 @@
         VTInteger: "鏁村舰",
         VTFilePath: "鏂囦欢",
         VTString: "瀛楃涓�"
-      }
+      },
+      //鏃堕棿鏍煎紡涓嬫媺妗�
+      codeDataFlag:false,
     }
   },
   computed:{
@@ -1294,9 +1295,18 @@
     formAttr(row, column) {
       console.log(row,column)
     },
+    //鏃堕棿涓嬫媺鏍煎紡
+    DataChangeHandler(){
+      debugger
+      listByFlag({comboxKey: 'codedateformat',
+        id: 'codedateformat',
+        namespace: 'codeclstempattr',
+        flag: 'dateFormates'}).then(res=>{
+        console.log(res)
+      })
+    },
     //灞炴�у垎缁勬寜閽�
     attrVisibleHandle() {
-
       if (this.attrSelectList.length > 1) {
         this.$message.warning('鍙兘閫夋嫨涓�鏉℃ā鏉垮睘鎬�')
       } else if (this.attrSelectList < 1) {
@@ -1393,18 +1403,32 @@
           'conditionMap[classifyTemplateOid]': this.Formlist[0].oid,
           'conditionMap[oid_notequal]': this.attrOid
         }).then(res => {
+          console.log(res)
           this.CascadeData = res.data.data;
         })
       }
     },
-    // 鎺掑簭棰勮鎸夐挳
-    orderHandle(){
-      this.$refs.referAttrCrud.sort("orderNum");
+    //绾ц仈淇濆瓨
+    CascadeAddHandle() {
+      let CascadeString = "";
+      CascadeString = this.selectRowArr.id + (this.selectRowArr.name);
+      this.$set(this.attrRow, 'parentCode', CascadeString)
+      this.CascadeVisible = false;
+    },
+    //绾ц仈灞炴�ф竻闄�
+    casRemove() {
+      this.selectRow = ""
+    },
+    // 绾ц仈灞炴�ц鍗曢��
+    CascaderowClick(row) {
+      this.selectRow = row.$index;
+      this.selectRowArr=row
     },
     //琛ㄦ牸鍗曢��
     selectHandle(selection, row) {
       this.attrOid = row.oid;
       this.attrRow = row;
+      console.log(row)
     },
     //琛ㄦ牸閫夋嫨
     selectionChange(list) {
@@ -1416,29 +1440,20 @@
         this.$message.success('淇濆瓨鎴愬姛')
       })
     },
-    //绾ц仈淇濆瓨
-    CascadeAddHandle() {
-      let CascadeString = "";
-      CascadeString = this.attrRow.id + (this.attrRow.name);
-      this.$set(this.attrRow, 'parentCode', CascadeString)
-      this.CascadeVisible = false;
-    },
-    //绾ц仈灞炴�ф竻闄�
-    casRemove() {
-      this.selectRow = ""
-    },
-    // 绾ц仈灞炴�ц鍗曢��
-    CascaderowClick(row) {
-      this.selectRow = row.$index
-    },
+
     //琛ㄦ牸琛岀紪杈�
     handleCellClicks(row, column) {
         this.editingRows = row;
         this.editShows = column.property;
         this.rowOid = row.oid;
+      console.log(row,column)
+      if(column.property == 'codeDateFormat' ){
+
+      }
     },
     saveRows() {
       this.editingRows = null;
+      console.log('1321')
     },
     // 鏋氫妇娉ㄥ叆娣诲姞涓�琛岀┖鏁版嵁
     addRow() {
@@ -1520,7 +1535,7 @@
         "灞傜骇璁剧疆": this.injectOption.injectNum,
         "鏄惁鍙慨鏀�": this.injectOption.change
       }
-      console.log(this.injectOption)      
+      console.log(this.injectOption)
       this.$set(this.attrRow, 'classifyInvokeLevel', data);
       this.injectVisible = false
     },
@@ -1536,35 +1551,13 @@
       this.injectVisible = false
     },
     //灞炴�фā鏉胯〃鏍煎崟鍏冩牸鐐瑰嚮浜嬩欢
-    handleRowClick(row, column, cell, event) {
-      //鍒ゆ柇鐐瑰嚮涓嶆槸鎿嶄綔鏍忔墠鍙墽琛�
-      if (column.property != "menu") {
-        // 褰撳墠琛屽彉涓哄彲缂栬緫鐘舵��
-        this.rowList = row
-        row.$cellEdit = true
-        // 姣忎竴涓崟鍏冩牸鍔犱笂cell涓簍rue鎵嶆槸缂栬緫鐘舵��
-        //鎷垮埌姣忎釜columnKey锛岀偣鍑绘椂璁剧疆涓簍rue锛屽氨瀹炵幇鍗曞厓鏍肩紪杈戠姸鎬佷簡
-        this.rowCellList = this.findObject(this.option.column, column.columnKey)
-        this.rowCellList.cell = true
-        if (this.List.indexOf(column.columnKey) == -1) {
-          this.List.push(column.columnKey)
-        }
-        // if(this.List.length >= 2){
-        //   const cellName=this.List[0]
-        //
-        // }
-      }
-    },
     //琛ㄦ牸鎿嶄綔鏍忓垹闄�
     CrudRowDel(row) {
       this.ProData.splice(row.$index, 1)
     },
     //琛ㄦ牸鍒犻櫎
     CrudRemove() {
-      this.attrSelectList.forEach((item)=>{
-        this.ProData.splice(item.$index, 1)
-      })
-
+      this.ProData.splice(this.attrRow.$index, 1)
     },
     //琛ㄦ牸閲嶇疆
     reset() {
diff --git a/Source/UBCS-WEB/src/components/Tree/classifyTreeform.vue b/Source/UBCS-WEB/src/components/Tree/classifyTreeform.vue
index a5dc3e3..593fc18 100644
--- a/Source/UBCS-WEB/src/components/Tree/classifyTreeform.vue
+++ b/Source/UBCS-WEB/src/components/Tree/classifyTreeform.vue
@@ -1,13 +1,14 @@
 <template>
   <div>
-    <avue-form v-model="loneTreeNewForm" :option="option" @submit="submit" v-if="flag == 'renonly'">
+    <avue-form v-model="loneTreeNewForm" :option="option" v-if="flag == 'renonly'">
     </avue-form>
     <avue-form v-model="loneTreeNewForm" :option="options" @submit="submits" v-else-if="flag == 'edit'">
     </avue-form>
     <div>
-<!--      涓恒�愮紪鐮佽鍒欍�戦�夊彇鍊�-->
-      <el-dialog  :visible.sync="MasterdialogVisible"   title="涓恒�愮紪鐮佽鍒欍�戦�夊彇鍊�" append-to-body>
-        <avue-crud :data="masterData" :option="masterOption" @select="masterSelect"></avue-crud>
+
+<!--     瀛樺偍涓氬姟绫诲瀷-->
+      <el-dialog  :visible.sync="BtmdialogVisible"   title="涓恒�愬瓨鍌ㄤ笟鍔$被鍨嬨�戦�夊彇鍊�" append-to-body>
+        <avue-crud :data="BtmData" :option="btmOption" @select="btmSelect"></avue-crud>
         <div style="padding-top: 10px;display: flex; justify-content: flex-end" >
           <el-button type="primary" size="small" @click="MasterHandlerClick">纭畾</el-button>
           <el-button  size="small" @click="MasterdialogVisible=false">鍙栨秷</el-button>
@@ -15,7 +16,7 @@
       </el-dialog>
 <!--      鍏抽敭灞炴�ф煡璇㈣鍒�-->
       <el-dialog  :visible.sync="KeydialogVisible"   title="涓恒�愬叧閿睘鎬ф煡璇㈣鍒欍�戦�夊彇鍊�" append-to-body>
-        <avue-crud :data="KeyData" :option="masterOption" @select="masterSelect"></avue-crud>
+        <avue-crud :data="KeyData" :option="masterOption" @select="KeySelect"></avue-crud>
         <div style="padding-top: 10px;display: flex; justify-content: flex-end" >
           <el-button type="primary" size="small" @click="KeyHandlerClick">纭畾</el-button>
           <el-button  size="small" @click="KeydialogVisible=false">鍙栨秷</el-button>
@@ -23,7 +24,7 @@
       </el-dialog>
       <!--      鐩镐技椤规煡璇㈣鍒�-->
       <el-dialog  :visible.sync="SimidialogVisible"   title="涓恒�愮浉浼奸」鏌ヨ瑙勫垯銆戦�夊彇鍊�" append-to-body>
-        <avue-crud :data="simData" :option="masterOption" @select="masterSelect"></avue-crud>
+        <avue-crud :data="simData" :option="masterOption" @select="simSelect"></avue-crud>
         <div style="padding-top: 10px;display: flex; justify-content: flex-end" >
           <el-button type="primary" size="small" @click="simHandlerClick">纭畾</el-button>
           <el-button  size="small" @click="SimidialogVisible=false">鍙栨秷</el-button>
@@ -34,20 +35,49 @@
 </template>
 
 <script>
-import {defaultReferDataGrid} from '@/api/MasterData/master'
+import {defaultReferDataGrid,referDataGrid} from '@/api/MasterData/master'
 import {TreeEditSave} from '@/api/template/templateAttr'
 export default {
   name: "classifyTreeform.vue",
-  props: ['loneTreeNewForm','flag'],
+  props: ['loneTreeNewForm','flag','Editclose'],
   data() {
     return {
-      name:"",
-      oid:"",
+      masterName:"",
+      masterOid:"",
+      KeyName:"",
+      KeyOid:"",
+      simName:"",
+      simOid:"",
+      btmName:"",
+      btmOid:"",
       masterInput:'',
       MasterSearchSelects:"",
       masterData:[],
       KeyData:[],
       simData:[],
+      BtmData:[],
+      btmOption:{
+        addBtn:false,
+        index:true,
+        border:true,
+        selection:true,
+        menu:false,
+        height:380,
+        column:[
+          {
+            label:'涓氬姟绫诲瀷缂栧彿',
+            prop:'id'
+          },
+          {
+            label:'涓氬姟绫诲瀷鍚嶇О',
+            prop:'name'
+          },
+          {
+            label:'鎻忚堪',
+            prop:'description'
+          }
+        ]
+      },
       masterOption:{
         addBtn:false,
         index:true,
@@ -73,6 +103,7 @@
       MasterdialogVisible:false,
       KeydialogVisible:false,
       SimidialogVisible:false,
+      BtmdialogVisible:false,
       form: {
         name: "鍝堝搱",
         sex: "鐢�"
@@ -172,6 +203,7 @@
             label: '瀛樺偍鐨勪笟鍔$被鍨�',
             prop: 'btmtypename',
             labelWidth:128,
+            focus:this.btmFoucus,
             rules: [{
               required: true,
               message: "瀛樺偍鐨勪笟鍔$被鍨�",
@@ -200,20 +232,21 @@
         ]
       },
       FormList: {},
-      masterSelectList:[]
+      masterSelectList:[],
+      KeySelectLIst:[],
+      simSelectList:[],
+      btmSelectList:[]
     }
   },
   created() {
   },
   methods: {
     submits(form,done){
-      console.log(this.loneTreeNewForm)
       TreeEditSave(this.loneTreeNewForm).then(res=>{
         this.$message.success('淇敼鎴愬姛');
-      }).catch(res=>{
-        this.$message.error(res)
+        this.Editclose()
+        done()
       })
-      done()
     },
     error(err) {
       this.$message.success('璇锋煡鐪嬫帶鍒跺彴');
@@ -233,17 +266,17 @@
       }else {
         this.MasterdialogVisible=false;
         this.masterSelectList=[]
-        this.loneTreeNewForm.codeRuleOidName=this.name;
-        this.loneTreeNewForm.codeRuleOid=this.oid;
-        console.log(this.masterSelectList)
+        this.$set(this.loneTreeNewForm,'coderuleoidName',this.masterName)
+        this.$set(this.loneTreeNewForm,'coderuleOid',this.masterOid)
+        this.$emit('MasterHandler',this.loneTreeNewForm)
+        console.log(this.loneTreeNewForm)
       }
     },
     //缂栫爜澶氶��
     masterSelect(row){
-      console.log(row)
       this.masterSelectList=row;
-      this.name=row[0].name;
-      this.oid=row[0].oid;
+      this.masterName=row[0].name;
+      this.masterOid=row[0].oid;
       console.log('oid',this.oid)
     },
     //缂栫爜鎺ュ彛
@@ -253,10 +286,7 @@
         isMuti:'false',
         'conditionMap["lcstatus"]':'Released'
       }).then(res=>{
-        console.log('---',res)
         this.masterData=res.data.records;
-        console.log('masterData',this.masterData)
-
       })
     },
     // 鍏抽敭灞炴�уけ鐒�
@@ -266,31 +296,86 @@
     },
     //鍏抽敭灞炴�х‘瀹�
     KeyHandlerClick(){
-      if(this.masterSelectList.length>1){
+      if(this.KeySelectLIst.length>1){
         this.$message.warning('鍙兘閫夋嫨涓�鏉℃暟鎹�')
-      }else if(this.masterSelectList.length<=0){
+      }else if(this.KeySelectLIst.length<=0){
         this.$message.warning('璇烽�夋嫨涓�鏉℃暟鎹�')
       }else {
-
+        this.KeydialogVisible=false;
+        this.KeySelectLIst=[]
+        this.$set(this.loneTreeNewForm,'codeResembleRuleOidName',this.simName)
+        this.$set(this.loneTreeNewForm,'codeResembleRuleOid',this.simOid)
+        this.$emit('MasterHandler',this.loneTreeNewForm)
       }
     },
+    //鍏抽敭灞炴�ф帴鍙�
     KeydefaultRend(){
       defaultReferDataGrid({
         referType:'codekeyattrrepeat',
         isMuti:'false',
         'conditionMap["lcstatus"]':'Enabled'
       }).then(res=>{
-        this.keyData=res.data.records;
-        console.log('key',this.keyData)
+        this.KeyData=res.data.records;
       })
+    },
+    // 鍏抽敭澶氶��
+    KeySelect(row){
+      this.KeySelectLIst=row;
+      this.KeyName=row[0].name;
+      this.KeyOid=row[0].oid;
     },
     // 鐩镐技椤瑰け鐒�
     simFouce(){
       this.SimidialogVisible=true;
+      this.simdefaultRend()
     },
     //鐩镐技椤圭‘瀹�
     simHandlerClick(){
-
+      if(this.simSelectList.length>1){
+        this.$message.warning('鍙兘閫夋嫨涓�鏉℃暟鎹�')
+      }else if(this.simSelectList.length<=0){
+        this.$message.warning('璇烽�夋嫨涓�鏉℃暟鎹�')
+      }else {
+        this.SimidialogVisible=false;
+        this.simSelectList=[]
+        this.$set(this.loneTreeNewForm,'codeResembleRuleOidName',this.simName)
+        this.$set(this.loneTreeNewForm,'codeResembleRuleOid',this.simOid)
+        this.$emit('MasterHandler',this.loneTreeNewForm)
+      }
+    },
+  //  鐩镐技椤瑰閫�
+    simSelect(row){
+      this.simSelectList=row;
+      this.simName=row[0].name;
+      this.simOid=row[0].oid;
+      console.log('oid',this.oid)
+    },
+    //鐩镐技椤归」鎺ュ彛
+    simdefaultRend(){
+      defaultReferDataGrid({
+        referType:'coderesemblerule',
+        isMuti:'false',
+        'conditionMap["lcstatus"]':'Enabled'
+      }).then(res=>{
+        this.simData=res.data.records;
+      })
+    },
+    //涓氬姟绫诲瀷澶辩劍
+    btmFoucus(){
+      this.BtmdialogVisible=true;
+      this.btmdefaultRend()
+    },
+  //  涓氬姟绫诲瀷澶氶��
+    btmSelect(row){
+      this.btmSelectList=row;
+      this.btmName=row[0].name;
+      this.btmOid=row[0].oid;
+    },
+    //涓氬姟绫诲瀷鎺ュ彛
+    btmdefaultRend(){
+      referDataGrid({valueField:'id',isMuti:'false'}).then(res=>{
+        console.log(res)
+      })
     }
   }
 }
@@ -299,6 +384,3 @@
 <style scoped>
 
 </style>
-
-<!--uiDataController/defaultReferDataGrid?referBo=coderule&isMuti=false&conditionMap%5B%22lcstatus%22%5D=Released-->
-<!--uiDataController/defaultReferDataGrid?conditionMap%5B%22lcstatus%22%5D=Released&referBo=coderule&isMuti=false&_=1687831291212-->
diff --git a/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue b/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue
index 4741278..4afd457 100644
--- a/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue
+++ b/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue
@@ -29,9 +29,6 @@
             <el-form-item label="鎻忚堪锛�" label-width="150px">
               <el-input v-model="TreeAddform.description" autocomplete="off" style="width: 585px"></el-input>
             </el-form-item>
-            <el-form-item v-show="this.TreeFlag==false" label="瀛樺偍鐨勪笟鍔$被鍨嬶細" label-width="150px">
-              <el-input v-model="TreeAddform.btmtypename" autocomplete="off" style="width: 585px"></el-input>
-            </el-form-item>
             <el-form-item label="缂栫爜瑙勫垯锛�" label-width="150px">
               <el-input v-model="TreeAddform.coderuleoidName" autocomplete="off" style="width: 585px"></el-input>
             </el-form-item>
@@ -51,7 +48,7 @@
         </el-dialog>
         <!--        淇敼瀵硅瘽妗�-->
         <el-dialog :visible.sync="TreeEditFormVisible" append-to-body title="淇敼鍒嗙被">
-          <classifyTreeform ref="childForm" :loneTreeNewForm="TreeList" :nodeList="nodeList" :flag="'edit'"></classifyTreeform>
+          <classifyTreeform ref="childForm" :loneTreeNewForm="TreeList" :nodeList="nodeList" :flag="'edit'" @MasterHandler="MasterHandler" :Editclose=" ()=>{TreeEditFormVisible=false}"></classifyTreeform>
         </el-dialog>
         <avue-tree ref="tree" v-model="CloneTreeAvueform" v-loading="loading" :data="CloneTreedata" :defaultExpandAll="false"
                    :option="Treeoption"
@@ -84,20 +81,6 @@
             <el-button plain size="small" type="primary" @click="Enable">鍚敤</el-button>
             <el-button plain size="small" type="primary" @click="Deactivate">鍋滅敤</el-button>
               <el-button plain size="small" type="primary" @click="CloneBtn">浠庡叾瀹冩ā鏉垮厠闅�</el-button>
-              <!-- <div style="display: inline-block">
-                <el-select v-model="searchTemplate.searchCondition" placeholder="璇烽�夋嫨" class="search-condition">
-                  <el-option
-                    v-for="item in searchTemplateOptions"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value">
-                  </el-option>
-                </el-select>
-                <el-input v-model="searchTemplate.findText" placeholder="璇疯緭鍏ュ叧閿瓧鎸夊洖杞︽煡璇�"
-                  size="small"
-                  @keyup.enter.native="EnterFind">
-                </el-input>
-              </div> -->
               <!--              鏌ヨ瀵硅瘽妗�-->
            <el-dialog :visible.sync="FindFormVisible" append-to-body title="楂樼骇鏌ヨ">
               <div>
@@ -187,10 +170,6 @@
   </el-container>
 </template>
 <script>
-//杩欓噷澹版槑涓�浜涜彍鍗曠粍浠剁敤娉曪細棣栧厛甯冨眬鍒嗕负宸︿晶鑿滃崟鍙充晶琛ㄦ牸锛屽彲鑳戒細鏈夊彸渚ab鏍忓姞琛ㄥ崟鐨勬儏鍐点�傛墍浠ュ彟澶栧紩鍏ヤ簡涓�涓彸渚ц〃鍗曠殑缁勪欢"classifyTreeform"銆�
-//棣栧厛鐖剁粍浠惰皟鐢ㄥ瓙缁勪欢鑿滃崟锛岄�氳繃provide浼犻�掑弬鏁般�傛湁Treeoption宸︿晶鏍戞柊澧炶〃鍗曢」 Treedata宸︿晶鏍戣妭鐐归厤缃」 crudTreeOption鍙充晶琛ㄦ牸閰嶇疆椤� crudTreeData鍙充晶琛ㄦ牸鏄剧ず鍐呭
-//鍏朵腑琛ㄦ牸鐨勯厤缃」鐩存帴鐖朵紶瀛愪紶閫掕繃鏉ュ氨琛岋紝鐩存帴:option=浼犻�掔殑鍙傛暟鍚嶏紝閲岄潰鏁版嵁鏄剧ず鐨勫唴瀹瑰洜涓烘槸鍜屽乏渚ц仈鍔ㄧ殑锛屾墍浠ラ噸鏂颁竴涓狥ormlist锛岄�氳繃鐐瑰嚮鏍戣妭鐐逛笅鏍囨潵鍔ㄦ�佹覆鏌撳彸渚ц〃鏍硷紝涓嬮潰鏂规硶閮芥湁鍏蜂綋娉ㄩ噴
-//鐒跺悗鍐嶈鍙充晶鐨勮〃鍗曪紝涓撻棬瀹氫箟浜嗕竴涓粍浠讹紝閫氳繃鐖朵紶瀛愬啀鎶婅〃鍗曟暟鎹甌reeList浼犻�掕繃鍘伙紝浼犻�掑墠鍦�10deCLi1ck鏂规硶閲岄潰渚夸簡澶勭悊涔熸槸涓�涓仈鍔ㄧ殑鏁堟灉锛岃〃鍗曠殑閰嶇疆椤瑰湪鍝釜瀛愮粍浠舵垨鑰呯埗缁勪欢鍐欓兘鍙互銆�
 import {
   getAtrrList,
   TreeSave,
@@ -217,45 +196,6 @@
   inject: [, "crudTreeData"],
   data() {
     return {
-      // //琛ㄦ牸option閰嶇疆椤�
-      // crudTreeOption: {
-      //   index: true,
-      //   border: true,
-      //   height:180,
-      //   selection:true,
-      //   addBtn:this.addFlag,
-      //   column: [
-      //     {
-      //       label: "妯℃澘缂栧彿",
-      //       prop: "id"
-      //     },
-      //     {
-      //       label:"妯℃澘鍚嶇О",
-      //       prop:"name"
-      //     },
-      //     {
-      //       label: "妯℃澘鎻忚堪",
-      //       prop:"description"
-      //     },
-      //     {
-      //       label:"鐗堟湰鍙�",
-      //       prop:"revisionSeq"
-      //     },
-      //     {
-      //       label:"鐘舵��",
-      //       prop:"lcStatusText"
-      //     }
-      //   ]
-      // },
-      // searchTemplateOptions: [
-      //   {
-      //     value: 'id',
-      //     label: '妯℃澘缂栧彿'
-      //   }, {
-      //     value: 'name',
-      //     label: '妯℃澘鍚嶇О'
-      //   }
-      // ],
       addFlag:false,
       // 琛ㄦ牸褰撳墠琛宨d
       crudOid:"",
@@ -268,7 +208,7 @@
         searchCondition: 'id',
         findText: "",
       },
-      
+
       //楂樼骇鏌ヨ瀵硅瘽妗�
       FindFormVisible: false,
       //鍏嬮殕妯℃澘瀵硅瘽妗�
@@ -494,6 +434,10 @@
     }
   },
   methods: {
+    MasterHandler(val){
+      console.log('鐖朵翰',val)
+      this.TreeList=val
+    },
     //琛屽崟閫変簨浠�
     selectHandle(selection,row){
       this.crudOid=row.oid;
diff --git a/Source/UBCS-WEB/src/components/template/SetPersonnel.vue b/Source/UBCS-WEB/src/components/template/SetPersonnel.vue
index 60d037f..22644e7 100644
--- a/Source/UBCS-WEB/src/components/template/SetPersonnel.vue
+++ b/Source/UBCS-WEB/src/components/template/SetPersonnel.vue
@@ -135,7 +135,7 @@
             return this.initFrom.findIndex(i => i.taskId === arr1)
         },
         async apiInit() {
-            const response = await personnelInit({ type: this.parameter[this.parameterKeys.type], templateId: this.parameter[this.parameterKeys.code],ids:this.parameter.ids, codeClassifyOid:this.parameter.codeClassifyOid})
+            const response = await personnelInit({ type: this.parameter[this.parameterKeys.type], templateId: this.parameter[this.parameterKeys.code]})
             if (response.status === 200) {
                 console.log(response)
                 this.initFrom = response.data.data.user
diff --git a/Source/UBCS-WEB/src/views/code/code.vue b/Source/UBCS-WEB/src/views/code/code.vue
index ecb6eac..b8f60a2 100644
--- a/Source/UBCS-WEB/src/views/code/code.vue
+++ b/Source/UBCS-WEB/src/views/code/code.vue
@@ -2648,12 +2648,12 @@
           // console.log(this.form);
         },
         // 绗竴娆¤姹傜殑鏋氫妇鏁版嵁鏀剧紦瀛�
-        getLocalStorageEnum(key){
-          let enumCach = JSON.parse(localStorage.getItem(key));
+        getLocalStorageEnum(enumKey){
+          let enumCach = JSON.parse(localStorage.getItem(enumKey));
           if(enumCach == null) {
-            getDictionary({code: key}).then(res=>{
+            getDictionary({code: enumKey}).then(res=>{
               enumCach = res.data.data;
-              localStorage.setItem(key,JSON.stringify(res.data.data));
+              localStorage.setItem(enumKey,JSON.stringify(res.data.data));
             })
           }
           return enumCach;
@@ -2697,7 +2697,7 @@
         loadCodeGetValueType(){
           this.enumParam.codeGetValueType =  this.getLocalStorageEnum("codeGetValueType");
         },
-
+        
       }
   };
 
diff --git a/Source/UBCS/ubcs-ops/ubcs-report/src/main/java/com/vci/ubcs/report/config/BladeReportConfiguration.java b/Source/UBCS/ubcs-ops/ubcs-report/src/main/java/com/vci/ubcs/report/config/BladeReportConfiguration.java
index cd043c2..d2d864f 100644
--- a/Source/UBCS/ubcs-ops/ubcs-report/src/main/java/com/vci/ubcs/report/config/BladeReportConfiguration.java
+++ b/Source/UBCS/ubcs-ops/ubcs-report/src/main/java/com/vci/ubcs/report/config/BladeReportConfiguration.java
@@ -16,7 +16,7 @@
  */
 package com.vci.ubcs.report.config;
 
-import com.vci.ubcs.core.report.datasource.ReportDataSource;
+import org.springblade.core.report.datasource.ReportDataSource;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/LifeCycleController.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/LifeCycleController.java
index 2360c4b..7410c7a 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/LifeCycleController.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/LifeCycleController.java
@@ -8,7 +8,6 @@
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.vo.LifeCycleVO;
 import com.vci.ubcs.omd.wrapper.LifeCycleRuleWrapper;
-import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
 import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -65,26 +64,48 @@
 	}
 
 	/**
-	 * 鏂板鎴栦慨鏀�
+	 * 鏂板
 	 */
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "鏂板鎴栦慨鏀�",notes = "浼犲叆鐢熷懡鍛ㄦ湡椤甸潰瀵硅薄")
-	public R<LifeCycleVO> submit(@RequestBody LifeCycleDTO lifeCycleDTO){
+	@ApiOperation(value = "鏂板",notes = "浼犲叆鐢熷懡鍛ㄦ湡椤甸潰瀵硅薄")
+	public R<LifeCycleVO> addSave(@RequestBody LifeCycleDTO lifeCycleDTO){
 		return R.data(lifeCycleService.addSave(lifeCycleDTO));
 	}
 
 	/**
-	 * 鏂板鎴栦慨鏀�
+	 * 淇敼
+	 */
+	@PutMapping("/edit-save")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "淇敼",notes = "浼犲叆鐢熷懡鍛ㄦ湡椤甸潰瀵硅薄")
+	public R<LifeCycleVO> editSave(@RequestBody LifeCycleDTO lifeCycleDTO){
+		return R.data(lifeCycleService.editSave(lifeCycleDTO));
+	}
+
+
+
+	/**
+	 * 鏂板
 	 */
 	@PostMapping("/batch-submit")
 	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "鏂板鎴栦慨鏀�",notes = "浼犲叆鐘舵�佹睜椤甸潰瀵硅薄")
-	public R<List<LifeCycleVO>> batchSubmit(@RequestBody List<LifeCycleDTO> lifeCycleDTOs){
+	@ApiOperation(value = "鏂板鎴栦慨鏀�",notes = "浼犲叆鐢熷懡鍛ㄦ湡椤甸潰瀵硅薄")
+	public R<List<LifeCycleVO>> batchAddSave(@RequestBody List<LifeCycleDTO> lifeCycleDTOs){
 		return R.data(lifeCycleService.batchAddSave(lifeCycleDTOs));
 	}
 
 	/**
+	 * 淇敼
+	 */
+	@PostMapping("/batch-edit-save")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "淇敼",notes = "浼犲叆鐢熷懡鍛ㄦ湡椤甸潰瀵硅薄")
+	public R<List<LifeCycleVO>> batchEditSave(@RequestBody List<LifeCycleDTO> lifeCycleDTOs){
+		return R.data(lifeCycleService.batchEditSave(lifeCycleDTOs));
+	}
+
+	/**
 	 * 鍒犻櫎
 	 */
 	@PostMapping("/remove")
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java
index b8a6aff..bdf2f81 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java
@@ -7,6 +7,7 @@
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
 import com.vci.ubcs.omd.vo.LinkTypeVO;
+import io.swagger.models.auth.In;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.tool.api.R;
@@ -253,15 +254,29 @@
 
 	/**
 	 * 鑾峰彇寮曠敤鏌愪釜鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨�
-	 * @param lifeOid 鐢熷懡鍛ㄦ湡鐨勪富閿�
+	 * @param lifeId 鐢熷懡鍛ㄦ湡鐨勭紪鍙�
 	 * @return 涓氬姟绫诲瀷鏄剧ず瀵硅薄
 	 */
     List<BtmTypeVO> selectByLifeId(String lifeId);
 
 	/**
+	 * 鑾峰彇寮曠敤鏌愪簺鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨�
+	 * @param lifeIds 鐢熷懡鍛ㄦ湡鐨勭紪鍙烽泦鍚�
+	 * @return 涓氬姟绫诲瀷鏄剧ず瀵硅薄
+	 */
+	List<BtmTypeVO> selectByLifeIds(Collection<String> lifeIds);
+
+	/**
 	 * 缁熻寮曠敤鏌愪釜鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨�
-	 * @param lifeOid 鐢熷懡鍛ㄦ湡鐨勪富閿�
+	 * @param lifeId 鐢熷懡鍛ㄦ湡鐨勭紪鍙�
 	 * @return 涓暟
 	 */
 	Integer countByLifeId(String lifeId);
+
+	/**
+	 * 缁熻寮曠敤鏌愪簺鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨�
+	 * @param lifeIds 鐢熷懡鍛ㄦ湡鐨勭紪鍙烽泦鍚�
+	 * @return 涓暟
+	 */
+	Integer countByLifeIds(Collection<String> lifeIds);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILifeCycleService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILifeCycleService.java
index 525cfcd..982c852 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILifeCycleService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILifeCycleService.java
@@ -9,6 +9,7 @@
 import com.vci.ubcs.starter.web.pagemodel.PageHelper;
 import org.springblade.core.mp.support.Query;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -39,7 +40,21 @@
 	 * @param lifeCycleDTOs 鏁版嵁浼犺緭瀵硅薄
 	 * @return 娣诲姞鍚庣殑鏄剧ず瀵硅薄
 	 */
-	List<LifeCycleVO> batchAddSave(List<LifeCycleDTO> lifeCycleDTOs);
+	List<LifeCycleVO> batchAddSave(Collection<LifeCycleDTO> lifeCycleDTOs);
+
+	/**
+	 * 淇敼淇濆瓨
+	 * @param lifeCycleDTO 鏁版嵁浼犺緭瀵硅薄
+	 * @return
+	 */
+	LifeCycleVO editSave(LifeCycleDTO lifeCycleDTO);
+
+	/**
+	 * 鎵归噺淇敼淇濆瓨
+	 * @param lifeCycleDTOs
+	 * @return
+	 */
+	List<LifeCycleVO> batchEditSave(Collection<LifeCycleDTO> lifeCycleDTOs);
 
 	/**
 	 * 鍒犻櫎鐢熷懡鍛ㄦ湡
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
index af7f220..a75265e 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
@@ -887,6 +887,30 @@
 	}
 
 	/**
+	 * 鑾峰彇寮曠敤鏌愪簺鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨�
+	 *
+	 * @param lifeIds 鐢熷懡鍛ㄦ湡鐨勭紪鍙烽泦鍚�
+	 * @return 涓氬姟绫诲瀷鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<BtmTypeVO> selectByLifeIds(Collection<String> lifeIds) {
+		if(CollectionUtils.isEmpty(lifeIds)){
+			return new ArrayList<>();
+		}
+		List<BtmType> btmTypeList = new ArrayList<>();
+		VciBaseUtil.switchCollectionForOracleIn(lifeIds).stream().forEach(ids->{
+			LambdaQueryWrapper<BtmType> query = new LambdaQueryWrapper<BtmType>();
+			ids.stream().forEach(id->{
+				query.eq(BtmType::getLifeCycleId,id);
+				query.or();
+			});
+			query.eq(BtmType::getLifeCycleId,"-1");
+			btmTypeList.addAll(baseMapper.selectList(query));
+		});
+		return BtmTypeWrapper.build().listEntityVO(btmTypeList);
+	}
+
+	/**
 	 * 缁熻寮曠敤鏌愪釜鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨�
 	 *
 	 * @param lifeId 鐢熷懡鍛ㄦ湡鐨勭紪鍙�
@@ -901,4 +925,28 @@
 		query.eq(BtmType::getLifeCycleId,lifeId);
 		return baseMapper.selectCount(query).intValue();
 	}
+
+	/**
+	 * 缁熻寮曠敤鏌愪簺鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨�
+	 *
+	 * @param lifeIds 鐢熷懡鍛ㄦ湡鐨勭紪鍙烽泦鍚�
+	 * @return 涓暟
+	 */
+	@Override
+	public Integer countByLifeIds(Collection<String> lifeIds) {
+		if(CollectionUtils.isEmpty(lifeIds)){
+			return 0;
+		}
+		final Integer[] total = {0};
+		VciBaseUtil.switchCollectionForOracleIn(lifeIds).stream().forEach(ids->{
+			LambdaQueryWrapper<BtmType> query = new LambdaQueryWrapper<BtmType>();
+			ids.stream().forEach(id->{
+				query.eq(BtmType::getLifeCycleId,id);
+				query.or();
+			});
+			query.eq(BtmType::getLifeCycleId,"-1");
+			total[0] += baseMapper.selectCount(query).intValue();
+		});
+		return total[0];
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java
index 62db19e..bd1f599 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java
@@ -268,7 +268,7 @@
 	 */
 	@Override
 	@Transactional
-	public List<LifeCycleVO> batchAddSave(List<LifeCycleDTO> lifeCycleDTOs) {
+	public List<LifeCycleVO> batchAddSave(Collection<LifeCycleDTO> lifeCycleDTOs) {
 		VciBaseUtil.alertNotNull(lifeCycleDTOs,"鐢熷懡鍛ㄦ湡鐨勪俊鎭�");
 		//鍏堥泦浣撴牎楠屼竴涓�
 		if(lifeCycleDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getId()) || !StringUtils.hasLength(s.getName())
@@ -276,7 +276,7 @@
 			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙凤紝鍚嶇О锛岃捣濮嬬姸鎬侊紝鍖呭惈鐨勮妭鐐逛笉鑳戒负绌�");
 		}
 		//缁熶竴鏍¢獙閲嶅
-		Map<String, List<LifeCycleDTO>> dtoMap = lifeCycleDTOs.stream().collect(Collectors.groupingBy(LifeCycleDTO::getId));
+		Map<String, List<LifeCycleDTO>> dtoMap = lifeCycleDTOs.stream().collect(Collectors.groupingBy(s->s.getId().toLowerCase(Locale.ROOT)));
 		dtoMap.forEach((id,dtos)->{
 			if(dtos.size()>1){
 				throw new VciBaseException("缂栧彿涓恒��" + id + "銆戠殑鐢熷懡鍛ㄦ湡閲嶅");
@@ -286,7 +286,7 @@
 			ids->{
 				QueryWrapper wrapper = new QueryWrapper(LifeCycleRule.class);
 				ids.stream().forEach(id->{
-					wrapper.eq("lower(id)",id.toLowerCase(Locale.ROOT));
+					wrapper.eq("lower(id)",id);
 					wrapper.or();
 				});
 				wrapper.eq("1","2");
@@ -304,6 +304,156 @@
 	}
 
 	/**
+	 * 淇敼淇濆瓨
+	 *
+	 * @param lifeCycleDTO 鏁版嵁浼犺緭瀵硅薄
+	 * @return
+	 */
+	@Override
+	public LifeCycleVO editSave(LifeCycleDTO lifeCycleDTO) {
+		VciBaseUtil.alertNotNull(lifeCycleDTO,"鐢熷懡鍛ㄦ湡淇℃伅",lifeCycleDTO.getId(),"鐢熷懡鍛ㄦ湡鐨勭紪鍙�",lifeCycleDTO.getName(),"鐢熷懡鍛ㄦ湡鍚嶇О"
+			,lifeCycleDTO.getNodes(),"鐢熷懡鍛ㄦ湡鐨勮妭鐐�",lifeCycleDTO.getStartStatus(),"璧峰鐘舵��",
+			lifeCycleDTO.getOid(),"涓婚敭");
+		LifeCycleRule rule = selectByOid(lifeCycleDTO.getOid());
+		//鏌ヨ閲嶅
+		QueryWrapper wrapper = new QueryWrapper(LifeCycleRule.class);
+		if(rule.getId().equals(lifeCycleDTO.getId())){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡缂栧彿涓嶈兘淇敼");
+		}
+		wrapper.eq("lower(id)",lifeCycleDTO.getId().toLowerCase(Locale.ROOT));
+		wrapper.ne("oid",lifeCycleDTO.getOid());
+		if(baseMapper.selectCount(wrapper)>0){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙蜂笉鑳介噸澶�");
+		}
+		editLifeCycle(lifeCycleDTO,rule);
+		return LifeCycleRuleWrapper.build().entityVO(getById(rule.getOid()));
+	}
+
+	/**
+	 * 淇敼鐢熷懡鍛ㄦ湡
+	 * @param lifeCycleDTO
+	 * @param life
+	 */
+	private void editLifeCycle(LifeCycleDTO lifeCycleDTO,LifeCycleRule life){
+		if(!lifeCycleDTO.getId().matches(RegExpConstant.LETTER)){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙峰彧鑳芥槸瀛楁瘝");
+		}
+		BeanUtil.convert(lifeCycleDTO,life);
+		String creator = AuthUtil.getUserAccount();
+		Date now = new Date();
+		life.setLastModifier(creator);
+		life.setLastModifyTime(now);
+		life.setTs(now);
+
+		//鍒犻櫎鐜板湪鍏ㄩ儴鐨勬暟鎹紝鐒跺悗閲嶆柊娣诲姞=
+		List<LifeCycleNode> nodeList = selectNodeByLifeOid(life.getOid());
+		List<LifeCycleEdge> edges = selectEdgeByLifeOid(life.getOid());
+		List<LifeCycleLineEvent> eventList = selectEventByEdgeOids(Optional.ofNullable(edges).orElseGet(ArrayList::new).stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		if(!CollectionUtils.isEmpty(nodeList)){
+			nodeMapper.deleteBatchIds(nodeList.stream().map(LifeCycleNode::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(edges)){
+			edgeMapper.deleteBatchIds(edges.stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(eventList)){
+			lineEventMapper.deleteBatchIds(eventList.stream().map(LifeCycleLineEvent::getOid).collect(Collectors.toList()));
+		}
+
+		List<String> statusList = new ArrayList<>();
+		//澶勭悊鑺傜偣
+		if(!CollectionUtils.isEmpty(lifeCycleDTO.getNodes())){
+			lifeCycleDTO.getNodes().stream().forEach(nodeDTO->{
+				addLifeCycleNode(nodeDTO,life.getOid(),creator,now);
+				statusList.add(nodeDTO.getId());
+			});
+		}
+		if(!statusList.contains(life.getStartStatus())){
+			throw new VciBaseException("璧峰鐘舵�佷笉鍦ㄧ敓鍛藉懆鏈熺殑鐢诲竷涓�");
+		}
+		//鍒ゆ柇鎵�鏈夌殑鑺傜偣鍦ㄧ郴缁熼噷閮藉瓨鍦�
+		List<String> existStatusIdList = statusService.listStatusByIdCollection(statusList).stream().map(StatusVO::getId).collect(Collectors.toList());
+		String unExistStatus = statusList.stream().filter(s -> !existStatusIdList.contains(s)).collect(Collectors.joining(","));
+		if(StringUtils.hasLength(unExistStatus)){
+			throw new VciBaseException(unExistStatus + "杩欎簺鐘舵�佸湪鐘舵�佹睜閲屼笉瀛樺湪锛屼笉鑳芥坊鍔犲埌鐢熷懡鍛ㄦ湡涓�");
+		}
+		//澶勭悊杈圭晫鍜岃繛鎺ョ嚎
+		if(!CollectionUtils.isEmpty(lifeCycleDTO.getEdges())){
+			lifeCycleDTO.getEdges().stream().forEach(edgeDTO->{
+				String edgeOid = addLifeCycleEdge(edgeDTO,statusList,life.getOid(),creator,now);
+				if(!CollectionUtils.isEmpty(edgeDTO.getEvents())){
+					//鏈変簨浠�
+					edgeDTO.getEvents().stream().forEach(eventDTO->{
+						addLifeCycleLineEvent(eventDTO,edgeOid,creator,now);
+					});
+				}
+			});
+		}
+		baseMapper.updateById(life);
+
+	}
+
+	/**
+	 * 浣跨敤涓婚敭鏌ヨ
+	 * @param oid
+	 * @return
+	 */
+	private LifeCycleRule selectByOid(String oid){
+		LifeCycleRule rule = null;
+		try {
+			rule = getById(oid);
+		}catch (Throwable e){
+			throw new VciBaseException("浣跨敤涓婚敭鑾峰彇瀵硅薄鍑洪敊锛岃繖涓暟鎹彲鑳戒笉瀛樺湪锛屾垨鑰呮暟鎹噸澶嶄簡");
+		}
+		return rule;
+	}
+
+	/**
+	 * 鎵归噺淇敼淇濆瓨
+	 *
+	 * @param lifeCycleDTOs
+	 * @return
+	 */
+	@Override
+	public List<LifeCycleVO> batchEditSave(Collection<LifeCycleDTO> lifeCycleDTOs) {
+		if(CollectionUtils.isEmpty(lifeCycleDTOs)){
+			return new ArrayList<>();
+		}
+		if(lifeCycleDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getId()) || !StringUtils.hasLength(s.getName())
+			|| CollectionUtils.isEmpty(s.getNodes()) || !StringUtils.hasLength(s.getStartStatus()))){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙凤紝鍚嶇О锛岃捣濮嬬姸鎬侊紝鍖呭惈鐨勮妭鐐逛笉鑳戒负绌�");
+		}
+		//缁熶竴鏍¢獙閲嶅
+		Map<String, List<LifeCycleDTO>> dtoMap = lifeCycleDTOs.stream().collect(Collectors.groupingBy(s->s.getId().toLowerCase(Locale.ROOT)));
+		dtoMap.forEach((id,dtos)->{
+			if(dtos.size()>1){
+				throw new VciBaseException("缂栧彿涓恒��" + id + "銆戠殑鐢熷懡鍛ㄦ湡閲嶅");
+			}
+		});
+		VciBaseUtil.switchCollectionForOracleIn(dtoMap.keySet()).stream().forEach(
+			ids->{
+				QueryWrapper wrapper = new QueryWrapper(LifeCycleRule.class);
+				ids.stream().forEach(id->{
+					wrapper.eq("lower(id)",id);
+					wrapper.ne("oid",dtoMap.get(id).get(0).getOid());
+					wrapper.or();
+				});
+				wrapper.eq("1","2");
+				if(baseMapper.selectCount(wrapper)>0){
+					throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙蜂笉鑳介噸澶�");
+				}
+			}
+		);
+		List<String> oidList = lifeCycleDTOs.stream().map(LifeCycleDTO::getOid).collect(Collectors.toList());
+		List<LifeCycleRule> rules = listByIds(oidList);
+		if(!CollectionUtils.isEmpty(rules)){
+			rules.stream().forEach(life->{
+				editLifeCycle(dtoMap.get(life.getId().toLowerCase(Locale.ROOT)).get(0),life);
+			});
+		}
+		return LifeCycleRuleWrapper.build().listEntityVO(listByIds(oidList));
+	}
+
+	/**
 	 * 鍒犻櫎鐢熷懡鍛ㄦ湡
 	 *
 	 * @param lifeCycleDTO 鏁版嵁浼犺緭瀵硅薄
@@ -312,22 +462,93 @@
 	@Transactional
 	public void delete(LifeCycleDTO lifeCycleDTO) {
 		VciBaseUtil.alertNotNull(lifeCycleDTO,"鏁版嵁浼犺緭瀵硅薄",lifeCycleDTO.getOid(),"涓婚敭");
-		LifeCycleRule rule = null;
-		try {
-			rule = getById(lifeCycleDTO.getOid());
-		}catch (Throwable e){
-			throw new VciBaseException("浣跨敤涓婚敭鑾峰彇瀵硅薄鍑洪敊锛岃繖涓暟鎹彲鑳戒笉瀛樺湪锛屾垨鑰呮暟鎹噸澶嶄簡");
-		}
+		LifeCycleRule rule = selectByOid(lifeCycleDTO.getOid());
 		//妫�鏌ヨ寮曠敤涓嶈兘鍒犻櫎
-		Integer count = btmTypeService.countByLifeId(lifeCycleDTO.getOid());
+		Integer count = btmTypeService.countByLifeId(lifeCycleDTO.getId());
 		if(count !=null && count>0){
 			throw new VciBaseException("鐢熷懡鍛ㄦ湡琚娇鐢紝涓嶈兘琚垹闄�");
 		}
 		//鎴戜滑鏌ヨ鍏ㄩ儴node鍜宔dge锛岀劧鍚庝竴璧峰垹闄�
+		List<LifeCycleNode> nodeList = selectNodeByLifeOid(rule.getOid());
+		List<LifeCycleEdge> edges = selectEdgeByLifeOid(rule.getOid());
+		List<LifeCycleLineEvent> eventList = selectEventByEdgeOids(Optional.ofNullable(edges).orElseGet(ArrayList::new).stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		if(!CollectionUtils.isEmpty(nodeList)){
+			nodeMapper.deleteBatchIds(nodeList.stream().map(LifeCycleNode::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(edges)){
+			edgeMapper.deleteBatchIds(edges.stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(eventList)){
+			lineEventMapper.deleteBatchIds(eventList.stream().map(LifeCycleLineEvent::getOid).collect(Collectors.toList()));
+		}
+		baseMapper.deleteById(rule);
+	}
 
+	/**
+	 * 鏌ヨ閾炬帴绾�
+	 * @param lifeOid
+	 * @return
+	 */
+	private List<LifeCycleEdge> selectEdgeByLifeOid(String lifeOid){
+		 if(!StringUtils.hasLength(lifeOid)){
+			 return new ArrayList<>();
+		 }
+		LambdaQueryWrapper<LifeCycleEdge> query = new LambdaQueryWrapper<LifeCycleEdge>();
+		query.eq(LifeCycleEdge::getLifeCycleOid,lifeOid);
+		return edgeMapper.selectList(query);
 	}
 
 
+	/**
+	 * 鑾峰彇鑺傜偣鐨勪俊鎭�
+	 * @param lifeOids 鐢熷懡鍛ㄦ湡鐨勪富閿泦鍚�
+	 * @return
+	 */
+	private List<LifeCycleEdge> selectEdgeByLifeOids(Collection<String> lifeOids){
+		if(!CollectionUtils.isEmpty(lifeOids)){
+			return new ArrayList<>();
+		}
+		List<LifeCycleEdge> edgeList = new ArrayList<>();
+		VciBaseUtil.switchCollectionForOracleIn(lifeOids).stream().forEach(lOids->{
+			LambdaQueryWrapper<LifeCycleEdge> query = new LambdaQueryWrapper<LifeCycleEdge>();
+			lOids.stream().forEach(lOid->{
+				query.eq(LifeCycleEdge::getLifeCycleOid,lOid);
+				query.or();
+			});
+			query.eq(LifeCycleEdge::getLifeCycleOid,"-1");
+			edgeList.addAll(edgeMapper.selectList(query));
+		});
+		return edgeList;
+	}
+
+	/**
+	 * 鏌ヨ閾炬帴绾夸笂鐨勪簨浠�
+	 * @param edgeOids
+	 * @return
+	 */
+	private List<LifeCycleLineEvent> selectEventByEdgeOids(Collection<String> edgeOids){
+		if(CollectionUtils.isEmpty(edgeOids)){
+			return new ArrayList<>();
+		}
+		List<LifeCycleLineEvent> eventList = new ArrayList<>();
+		VciBaseUtil.switchCollectionForOracleIn(edgeOids).stream().forEach(edgeOidList->{
+			LambdaQueryWrapper<LifeCycleLineEvent> query = new LambdaQueryWrapper<LifeCycleLineEvent>();
+			edgeOidList.stream().forEach(edgeOid->{
+				query.eq(LifeCycleLineEvent::getPkLifeCycleEdge,edgeOid);
+				query.or();
+			});
+			query.eq(LifeCycleLineEvent::getPkLifeCycleEdge,"-1");
+			eventList.addAll(lineEventMapper.selectList(query));
+		});
+		return eventList;
+	}
+
+
+	/**
+	 * 鑾峰彇鑺傜偣鐨勪俊鎭�
+	 * @param lifeOid
+	 * @return
+	 */
 	private List<LifeCycleNode> selectNodeByLifeOid(String lifeOid){
 		if(!StringUtils.hasLength(lifeOid)){
 			return new ArrayList<>();
@@ -338,13 +559,60 @@
 	}
 
 	/**
+	 * 鑾峰彇鑺傜偣鐨勪俊鎭�
+	 * @param lifeOids 鐢熷懡鍛ㄦ湡鐨勪富閿泦鍚�
+	 * @return
+	 */
+	private List<LifeCycleNode> selectNodeByLifeOids(Collection<String> lifeOids){
+		if(!CollectionUtils.isEmpty(lifeOids)){
+			return new ArrayList<>();
+		}
+		List<LifeCycleNode> nodeList = new ArrayList<>();
+		VciBaseUtil.switchCollectionForOracleIn(lifeOids).stream().forEach(lOids->{
+			LambdaQueryWrapper<LifeCycleNode> query = new LambdaQueryWrapper<LifeCycleNode>();
+			lOids.stream().forEach(lOid->{
+				query.eq(LifeCycleNode::getLifeCycleOid,lOid);
+				query.or();
+			});
+			query.eq(LifeCycleNode::getLifeCycleOid,"-1");
+			nodeList.addAll(nodeMapper.selectList(query));
+		});
+		return nodeList;
+	}
+
+	/**
 	 * 鎵归噺鍒犻櫎鐢熷懡鍛ㄦ湡
 	 *
 	 * @param lifeCycleDTOs 鏁版嵁浼犺緭瀵硅薄鍒楄〃
 	 */
 	@Override
+	@Transactional
 	public void batchDelete(List<LifeCycleDTO> lifeCycleDTOs) {
-
+		VciBaseUtil.alertNotNull(lifeCycleDTOs,"鐢熷懡鍛ㄦ湡鐨勪俊鎭�");
+		if(lifeCycleDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getOid()))){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勪富閿笉鑳戒负绌�");
+		}
+		List<String> oidList = lifeCycleDTOs.stream().map(LifeCycleDTO::getOid).collect(Collectors.toList());
+		List<LifeCycleRule> lifeList = baseMapper.selectBatchIds(oidList);
+		//鎵归噺鏌ヨ
+		String usedBtmTypeId = Optional.ofNullable(btmTypeService.selectByLifeIds(lifeList.stream().map(LifeCycleRule::getId).collect(Collectors.toList()))).orElseGet(ArrayList::new).stream().map(BtmTypeVO::getId).collect(Collectors.joining(","));
+		if(StringUtils.hasLength(usedBtmTypeId)){
+			throw new VciBaseException(usedBtmTypeId + "杩欎簺涓氬姟绫诲瀷寮曠敤浜嗙敓鍛藉懆鏈燂紝涓嶈兘鍒犻櫎");
+		}
+		List<LifeCycleNode> nodeList = selectNodeByLifeOids(oidList);
+		List<LifeCycleEdge> edgeList = selectEdgeByLifeOids(oidList);
+		if(!CollectionUtils.isEmpty(nodeList)){
+			nodeMapper.deleteBatchIds(nodeList.stream().map(LifeCycleNode::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(edgeList)){
+			List<String> edgeOids = edgeList.stream().map(LifeCycleEdge::getOid).collect(Collectors.toList());
+			edgeMapper.deleteBatchIds(edgeOids);
+			List<LifeCycleLineEvent> eventList = selectEventByEdgeOids(edgeOids);
+			if(!CollectionUtils.isEmpty(eventList)){
+				lineEventMapper.deleteBatchIds(eventList.stream().map(LifeCycleLineEvent::getOid).collect(Collectors.toList()));
+			}
+		}
+		baseMapper.deleteBatchIds(oidList);
 	}
 
 	/**
@@ -355,6 +623,8 @@
 	 */
 	@Override
 	public List<BtmTypeVO> listUses(LifeCycleDTO lifeCycleDTO) {
-		return null;
+		VciBaseUtil.alertNotNull(lifeCycleDTO,"鏁版嵁浼犺緭瀵硅薄",lifeCycleDTO.getOid(),"涓婚敭");
+		LifeCycleRule rule = selectByOid(lifeCycleDTO.getOid());
+		return btmTypeService.selectByLifeId(rule.getId());
 	}
 }

--
Gitblit v1.9.3