From 328b0158c3d97f87efc7da22a1e3f5a7c258b127 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期四, 04 七月 2024 19:17:17 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/revision/service/RevisionModelUtil.java     |   19 
 Source/plt-web/plt-web-ui/src/api/base/file/index.js                                                                 |   12 
 Source/plt-web/plt-web-ui/src/components/actions/handlers.js                                                         |    2 
 Source/plt-web/plt-web-ui/src/api/base/startWork/index.js                                                            |   22 
 Source/plt-web/plt-web-ui/src/components/actions/base/uploadFileAction.js                                            |    6 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java                  |  126 +++
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java |    5 
 Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue                                              |  264 ++++++--
 Source/plt-web/plt-web-ui/src/components/actions/base/StartWorkflowAction.js                                         |    1 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/VciFileUploadController.java              |    1 
 Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue                                                 |   92 +-
 Source/plt-web/plt-web-ui/README-AVUE.md                                                                             |   90 +++
 Source/plt-web/plt-web-ui/src/views/system/user/option.js                                                            |   78 +
 Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue                                            |   79 +-
 Source/plt-web/plt-web-ui/src/components/actions/base/downLoadFile.vue                                               |   13 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIDataServiceI.java                          |   27 
 Source/plt-web/plt-web-ui/src/api/system/user/api.js                                                                 |   66 +
 Source/plt-web/plt-web-ui/src/components/actions/base/downloadFileAction.js                                          |   22 
 Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue                                         |  146 ++++
 Source/plt-web/plt-web-ui/src/main.js                                                                                |    4 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java           |    3 
 Source/plt-web/plt-web-ui/src/App.vue                                                                                |    4 
 /dev/null                                                                                                            |  158 -----
 Source/plt-web/plt-web-ui/src/views/system/user/index.vue                                                            |  435 +++++++++++++
 Source/plt-web/plt-web-ui/src/util/basic-option.js                                                                   |    3 
 Source/plt-web/plt-web-ui/vue.config.js                                                                              |    4 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebUIDataController.java                  |   63 ++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java                   |    4 
 28 files changed, 1,341 insertions(+), 408 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/revision/service/RevisionModelUtil.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/revision/service/RevisionModelUtil.java
index 736f373..8f6f784 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/revision/service/RevisionModelUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/revision/service/RevisionModelUtil.java
@@ -395,16 +395,15 @@
      */
     public boolean checkDataSecret(BaseModel baseModel) throws VciBaseException{
         VciBaseUtil.alertNotNull(baseModel,"瑕佹牎楠屽瘑绾х殑鏁版嵁瀵硅薄");
-        //todo 鐧诲綍杩樻湭鍚敤锛屾墍浠ュ瘑绾ф棤娉曡幏鍙栭渶瑕佷慨鏀�
-//        if(isCheckSecret(baseModel) && VciBaseUtil.getCurrentUserSecret()>0) {
-//            if (baseModel.getSecretGrade() == null ) {
-//                baseModel.setSecretGrade(DataSecretEnum.NONE.getValue());
-//            }
-//            Integer userSecret = VciBaseUtil.getCurrentUserSecret();
-//            if (!checkUserSecret(baseModel.getSecretGrade())) {
-//                throw new VciBaseException("褰撳墠鐢ㄦ埛鐨勫瘑绾т綆浜庢暟鎹殑瀵嗙骇锛岀敤鎴峰瘑绾т负" + UserSecretEnum.getSecretText(userSecret) + ",鏁版嵁瀵嗙骇涓�" + DataSecretEnum.getSecretText(baseModel.getSecretGrade()));
-//            }
-//        }
+        if(isCheckSecret(baseModel) && VciBaseUtil.getCurrentUserSecret()>0) {
+            if (baseModel.getSecretGrade() == null ) {
+                baseModel.setSecretGrade(DataSecretEnum.NONE.getValue());
+            }
+            Integer userSecret = VciBaseUtil.getCurrentUserSecret();
+            if (!checkUserSecret(baseModel.getSecretGrade())) {
+                throw new VciBaseException("褰撳墠鐢ㄦ埛鐨勫瘑绾т綆浜庢暟鎹殑瀵嗙骇锛岀敤鎴峰瘑绾т负" + UserSecretEnum.getSecretText(userSecret) + ",鏁版嵁瀵嗙骇涓�" + DataSecretEnum.getSecretText(baseModel.getSecretGrade()));
+            }
+        }
         return true;
     }
 
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java
index 6f6112f..9679f27 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java
@@ -99,6 +99,11 @@
             //铏界劧涓嶆牎楠屾潈闄愶紝浣嗘槸濡傛灉token涓嶄负绌猴紝闇�瑕佹洿鏂板綋鍓嶇敤鎴�
             SessionInfo sessionInfo = getSessionInfo(userToken);
 
+            if(sessionInfo != null){
+                //鍒濆鍖栧钩鍙扮殑token
+                vciSessionForLoginI.initInvocationInfo(sessionInfo);
+            }
+
             return true;
         }
         //鑾峰彇閰嶇疆鏂囦欢涓紝涓嶆牎楠屾潈闄愮殑璺緞
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/VciFileUploadController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/VciFileUploadController.java
index 712ad4a..906cf78 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/VciFileUploadController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/VciFileUploadController.java
@@ -48,7 +48,6 @@
      * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
      */
     @PostMapping("/uploadFile")
-    @VciUnCheckRight
     public BaseResult<VciFileObjectVO> uploadFile(MultipartFile file, VciFileObjectDTO fileObjectDTO){
         try {
             if (file != null ) {
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebUIDataController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebUIDataController.java
index f342ec9..6c19aeb 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebUIDataController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebUIDataController.java
@@ -1,5 +1,7 @@
 package com.vci.web.controller;
 
+import com.vci.corba.common.PLException;
+import com.vci.corba.omd.data.BusinessObject;
 import com.vci.starter.web.annotation.controller.VciUnCheckRight;
 import com.vci.starter.web.annotation.log.VciBusinessLog;
 import com.vci.starter.web.pagemodel.*;
@@ -13,6 +15,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -115,14 +119,33 @@
     }
 
     /**
-     * 鏁版嵁鍗囩増锛屽墠绔娇鐢↗SON鎻愪氦
+     * 鏁版嵁鍗囩増鏈�/娆★紝鍓嶇浣跨敤JSON鎻愪氦
      * @param formDataDTO 琛ㄥ崟鏁版嵁
      * @return 鎵ц鐨勭粨鏋�
      */
     @PutMapping("/upRevision")
     @VciBusinessLog(operateName = "鏁版嵁鍗囩増",description = "${param.btmname}閲岀殑${param.copyFromVersion}")
-    public BaseResult<Map<String,Object>> upRevision(@RequestBody FormDataDTO formDataDTO){
+    public BaseResult<Map<String, Object>> upRevision(@RequestBody FormDataDTO formDataDTO) throws PLException {
         return uiDataService.upRevision(formDataDTO);
+    }
+
+    /**
+     * 鏁版嵁鍗囩増鏈�/娆★紝鍓嶇浣跨敤JSON鎻愪氦
+     * @param btmname 涓氬姟绫诲瀷鐨勪俊鎭�
+     * @param oid 涓氬姟鏁版嵁鐨勪富閿�
+     * @param type 1:鐗堟瀵硅薄锛�2锛氱増鏈璞★紱3锛氫富瀵硅薄
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @DeleteMapping("/deleteBusinessObject")
+    public BaseResult deleteBusinessObject(String btmname , String oid, int type) {
+        try {
+            return uiDataService.deleteBusinessObject(btmname, oid, type);
+        }catch (PLException e){
+            BaseResult<Object> objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
     }
 
     /**
@@ -187,4 +210,40 @@
         re.setData(dataMapList);
         return re;
     }
+    /**
+     * 鍙樻洿鎵�鏈夎��
+     * @param btmname 涓氬姟绫诲瀷
+     * @param oid 涓婚敭
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @PutMapping("/changeBusinessObjectOwner")
+    public BaseResult changeBusinessObjectOwner(String btmname , String oid) {
+        try {
+            return uiDataService.changeBusinessObjectOwner(btmname, oid);
+        } catch (PLException e) {
+            BaseResult<Object> objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 鐘舵�佽穬杩�
+     * @param btmname 涓氬姟绫诲瀷
+     * @param oid 涓婚敭
+     * @param releaseStatus 鍙戝竷鐘舵��
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @PutMapping("/transferBusinessObject")
+    public BaseResult transferBusinessObject(String btmname , String oid, String toStatus, String releaseStatus) {
+        try {
+            return uiDataService.transferBusinessObject(btmname, oid, toStatus, releaseStatus);
+        } catch (PLException e) {
+            BaseResult<Object> objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIDataServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIDataServiceI.java
index 0cd9432..dc2df3b 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIDataServiceI.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIDataServiceI.java
@@ -1,5 +1,6 @@
 package com.vci.web.service;
 
+import com.vci.corba.common.PLException;
 import com.vci.corba.omd.data.BusinessObject;
 import com.vci.corba.omd.data.LinkObject;
 import com.vci.corba.omd.data.RevisionDataInfo;
@@ -175,7 +176,7 @@
      * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
      * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
      */
-    BaseResult<Map<String, Object>> upRevision(FormDataDTO formDataDTO) throws VciBaseException;
+    BaseResult<Map<String, Object>> upRevision(FormDataDTO formDataDTO) throws VciBaseException, PLException;
 
     /**
      * 鎵归噺淇敼锛屾敞鎰忚〃鍗曞畾涔夌殑瀛楁鎵嶄細琚慨鏀癸紝ts杩欑榛樿瀛楁闄ゅ
@@ -248,4 +249,28 @@
      * @return 涓氬姟鏁版嵁鐨勫睘鎬т俊鎭�
      */
     List<Map<String,String>>  getDataAttr(String btmName, String oid);
+
+    /**
+     * 鏁版嵁鍗囩増鏈�/娆★紝鍓嶇浣跨敤JSON鎻愪氦
+     * @param btmname 涓氬姟绫诲瀷鐨勪俊鎭�
+     * @param oid 涓氬姟鏁版嵁鐨勪富閿�
+     * @param type 1:鐗堟瀵硅薄锛�2锛氱増鏈璞★紱3锛氫富瀵硅薄
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    BaseResult deleteBusinessObject(String btmname, String oid, int type) throws PLException;
+    /**
+     * 鍙樻洿鎵�鏈夎��
+     * @param btmname 涓氬姟绫诲瀷
+     * @param oid 涓婚敭
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    BaseResult changeBusinessObjectOwner(String btmname, String oid) throws PLException;
+    /**
+     * 鐘舵�佽穬杩�
+     * @param btmname 涓氬姟绫诲瀷
+     * @param oid 涓婚敭
+     * @param releaseStatus 鍙戝竷鐘舵��
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    BaseResult transferBusinessObject(String btmname, String oid, String toStatus, String releaseStatus) throws PLException;
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
index 93c7710..8f0443d 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
@@ -2,10 +2,8 @@
 
 import com.vci.client.common.providers.ClientServiceProvider;
 import com.vci.corba.common.PLException;
-import com.vci.corba.omd.data.BusinessObject;
-import com.vci.corba.omd.data.LinkObject;
-import com.vci.corba.omd.data.RevisionDataInfo;
-import com.vci.corba.omd.data.VersionDataInfo;
+import com.vci.corba.framework.data.UserInfo;
+import com.vci.corba.omd.data.*;
 import com.vci.corba.omd.lcm.LifeCycle;
 import com.vci.file.pagemodel.VciFileObjectVO;
 import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
@@ -37,6 +35,7 @@
 import org.apache.commons.lang3.StringUtils;
 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.lang.reflect.Method;
@@ -1243,7 +1242,7 @@
             if(baseModel.getRevisionValue() == null){
                 baseModel.setRevisionValue("");
             }
-            return  changeRevisionValueInfoToObject(platformClientUtil.getBOFactoryService().getNextRevisionValueObject(WebUtil.getTableName(btmTypeVO.getId()),baseModel.getNameOid(),btmTypeVO.getRevisionRuleId(),btmTypeVO.isInputRevisionFlag(),baseModel.getRevisionValue()));
+            return  changeRevisionValueInfoToObject(platformClientUtil.getBOFactoryService().getNextRevisionValueObject(btmTypeVO.getId(),baseModel.getNameOid(),btmTypeVO.getRevisionRuleId(),btmTypeVO.isInputRevisionFlag(),baseModel.getRevisionValue()));
         } catch (PLException vciError) {
             throw WebUtil.getVciBaseException(vciError);
         }
@@ -1429,7 +1428,7 @@
      * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
      */
     @Override
-    public BaseResult<Map<String, Object>> upRevision(FormDataDTO formDataDTO) throws VciBaseException {
+    public BaseResult<Map<String, Object>> upRevision(FormDataDTO formDataDTO) throws VciBaseException, PLException {
         //棣栧厛鍒ゆ柇瀵硅薄鏄惁涓虹┖
         VciBaseUtil.alertNotNull(formDataDTO,"淇敼鐨勬暟鎹璞�",formDataDTO.getBtmname(),"涓氬姟绫诲瀷鐨勫悕绉�",formDataDTO.getFormDefineId(),"琛ㄥ崟瀹氫箟鐨勭紪鍙�",formDataDTO.getCopyFromVersion(),"鑰佺増鏈殑涓婚敭");
         UIFormDefineVO formDefineVO = uiEngineService.getFormById(formDataDTO.getBtmname(), formDataDTO.getFormDefineId());
@@ -1440,28 +1439,40 @@
             //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
             return beforeResult;
         }
-        //灏佽鏁版嵁
-        BaseResult<BusinessObject> resultCbo = wrapperCbo(formDataDTO,formDefineVO,false,formDataDTO.isUpVersion()?false:true,formDataDTO.isUpVersion());
-        if(!resultCbo.isSuccess()){
-            return BaseResult.fail(resultCbo.getMsg(),resultCbo.getMsgObjs());
+        List<BusinessObject> businessObjects = null;
+        Date ts = formDataDTO.getTs();
+        Map<String,String> conditionMap = WebUtil.getOidQuery(formDataDTO.getCopyFromVersion());
+        conditionMap.put("ts", VciDateUtil.date2Str(ts,VciDateUtil.DateTimeMillFormat));
+        conditionMap.put("oid",formDataDTO.getCopyFromVersion());
+        businessObjects = boService.queryCBO(formDataDTO.getBtmname(), conditionMap);
+        if(businessObjects.size() ==0){
+            throw new VciBaseException("鏁版嵁涓嶆槸鏈�鏂扮殑锛屽缓璁偍鍒锋柊鍚庨噸鏂版搷浣�");
         }
+        //鎵╁睍灞炴�х殑鍊�
+        Map<String, String> data = formDataDTO.getData();
+        Map<String,String> dataLow = new HashMap<>();
+        data.forEach((key,value)->{
+            dataLow.put(key.toLowerCase(),value);
+        });
+
+        Map<String,String> baseDataMap = formDataDTO2MapLow(formDataDTO);
+        Map<String,String> allDataMapLow = new HashMap<>();
+        allDataMapLow.putAll(dataLow);
+        allDataMapLow.putAll(baseDataMap);
+        //鍒ゆ柇鍞竴椤�
+        BaseResult baseResult = checkUnique(formDefineVO, null, allDataMapLow, true);
+        if(!baseResult.isSuccess()){
+            return baseResult;
+        }
+        BusinessObject businessObject = platformClientUtil.getBOFService()
+                .revisionBusinessObject(businessObjects.get(0), null, !formDataDTO.isUpVersion(),true, false, false);
         //鎵ц淇濆瓨
-        BaseResult<Map<String,Object>> result = BaseResult.success();
-        try {
-            BusinessObject bo = platformClientUtil.getBOFService().createBusinessObject(resultCbo.getObj(),formDataDTO.isUpVersion()?false:true,formDataDTO.isUpVersion());
-            BusinessObject afterCbo = new BusinessObject();
-            afterCbo = bo;
-            result.setObj(boService.cbo2Map(afterCbo));
-        } catch (PLException vciError) {
-            throw WebUtil.getVciBaseException(vciError);
-        }
-        if(!CollectionUtils.isEmpty(formDataDTO.getReleaseFileOids())){
-            fileObjectService.releasedFile(resultCbo.getObj().btName,resultCbo.getObj().oid,formDataDTO.getReleaseFileOids());
-        }
+        BaseResult<Map<String, Object>> result = BaseResult.success();
+        result.setObj(boService.cbo2Map(businessObject));
         //鍚庣疆浜嬩欢
         String afterEvent = formDataDTO.getPostEvent();
         try {
-            callPostEvent(Arrays.stream(new BusinessObject[]{resultCbo.getObj()}).collect(Collectors.toList()), null,afterEvent, VciChangeDocumentTypeEnum.EDIT);
+            callPostEvent(Arrays.stream(new BusinessObject[]{businessObject}).collect(Collectors.toList()), null,afterEvent, VciChangeDocumentTypeEnum.EDIT);
         }catch (Throwable e){
             throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
         }
@@ -2454,4 +2465,73 @@
         }
         return dataMap;
     }
+
+    /**
+     * 鏁版嵁鍗囩増鏈�/娆★紝鍓嶇浣跨敤JSON鎻愪氦
+     * @param btmname 涓氬姟绫诲瀷鐨勪俊鎭�
+     * @param oid 涓氬姟鏁版嵁鐨勪富閿�
+     * @param type 1:鐗堟瀵硅薄锛�2锛氱増鏈璞★紱3锛氫富瀵硅薄
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @Override
+    public BaseResult deleteBusinessObject(String btmname, String oid, int type) throws PLException {
+        List<BusinessObject> cbos = boService.queryCBO(btmname,WebUtil.getOidQuery(oid));
+        BaseResult<Object> objectBaseResult = new BaseResult<>();
+        if(cbos.size() == 0){
+            objectBaseResult.setSuccess(false);
+            throw new PLException("500", new String[]{"娌℃湁鑾峰彇鍒版暟鎹殑涓婚敭"});
+        }
+        for (BusinessObject cbo : cbos) {
+            if(StringUtils.isBlank(cbo.revisionid)){
+                String revisionoid = Arrays.stream(cbo.hisAttrValList).filter(e -> e.attrName.equals("REVISIONOID")).findFirst().map(e -> e.attrVal).orElse("");
+                cbo.revisionid = revisionoid;
+            }
+            boolean b = platformClientUtil.getBOFService().deleteBusinessObject(cbo,type);
+            if(!b){
+                throw new PLException("500", new String[]{"鏁版嵁鍒犻櫎澶辫触锛侊紒"});
+            }
+        }
+        return BaseResult.success();
+    }
+    /**
+     * 鍙樻洿鎵�鏈夎��
+     * @param btmname 涓氬姟绫诲瀷
+     * @param oid 涓婚敭
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @Override
+    public BaseResult changeBusinessObjectOwner(String btmname, String oid) throws PLException {
+        List<BusinessObject> cbos = boService.queryCBO(btmname,WebUtil.getOidQuery(oid));
+        BaseResult<Object> objectBaseResult = new BaseResult<>();
+        if(cbos.size() == 0){
+            objectBaseResult.setSuccess(false);
+            throw new PLException("500", new String[]{"娌℃湁鑾峰彇鍒版暟鎹殑涓婚敭"});
+        }
+        UserInfo userInfo = platformClientUtil.getFrameworkService().getUserObjectByUserName(WebUtil.getCurrentUserId());
+        for (BusinessObject cbo : cbos) {
+            platformClientUtil.getBOFService().changeBusinessObjectOwner(cbo,userInfo);
+        }
+        return BaseResult.success();
+    }
+    /**
+     * 鍙樻洿鎵�鏈夎��
+     * @param btmname 涓氬姟绫诲瀷
+     * @param oid 涓婚敭
+     * @param releaseStatus 鍙戝竷鐘舵��
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @Override
+    @Transactional
+    public BaseResult transferBusinessObject(String btmname, String oid, String toStatus,String releaseStatus) throws PLException {
+        List<BusinessObject> cbos = boService.queryCBO(btmname,WebUtil.getOidQuery(oid));
+        BaseResult<Object> objectBaseResult = new BaseResult<>();
+        if(cbos.size() == 0){
+            objectBaseResult.setSuccess(false);
+            throw new PLException("500", new String[]{"娌℃湁鑾峰彇鍒版暟鎹殑涓婚敭"});
+        }
+        for (BusinessObject cbo : cbos) {
+            platformClientUtil.getBOFService().transferBusinessObjectAndRelease(cbo, toStatus, releaseStatus);
+        }
+        return BaseResult.success();
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java
index 09addb7..55ac98a 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java
@@ -205,9 +205,6 @@
         if(vciFileObjectDO.getSecretGrade() == null) {
             vciFileObjectDO.setSecretGrade(DataSecretEnum.NONE.getValue());
         }
-        //todo 鐧诲綍杩樻湭寮勫ソ闇�瑕佷慨鏀�
-        vciFileObjectDO.setCreator("1");
-        vciFileObjectDO.setLastModifier("1");
         revisionModelUtil.wrapperForAdd(vciFileObjectDO);
         //闅忔満璺緞
         String randomPath = VciBaseUtil.getPk();
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java
index f53eb5b..9938b92 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java
@@ -154,9 +154,7 @@
 		if(btmName!=null){
 			btmName = btmName.trim().toLowerCase();
 		}
-		//todo 鐢变簬鐧诲綍闂鍚庣画闇�瑕佷慨鏀�
-//		String userid = WebUtil.getCurrentUserId();
-		String userid = "1";
+		String userid = WebUtil.getCurrentUserId();
 		if(!hasCreatedCbos.containsKey(btmName)){
 			if(StringUtils.isEmpty(userid)){
 				throw new VciBaseException(msgCodePrefix +"noHasUserid");
diff --git a/Source/plt-web/plt-web-ui/README-AVUE.md b/Source/plt-web/plt-web-ui/README-AVUE.md
new file mode 100644
index 0000000..44a3145
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/README-AVUE.md
@@ -0,0 +1,90 @@
+## AVUE-CRUD 琛ㄦ牸閰嶇疆
+
+```javascript
+<avue-crud     :option="option"                 //琛ㄦ牸閰嶇疆灞炴��             
+               :table-loading="loading"         //琛ㄦ牸绛夊緟妗嗙殑鎺у埗锛屽姞杞界殑鏃跺�欒浆鍦堝湀锛岃缃畉rue/false
+               :search.sync="search"            //鎼滅储鐨勫彉閲�(闇�瑕乻ync淇グ绗�)
+               :visible.sync="changeInfo"       //鏄惁鏄剧ず锛岃缃畉rue/false
+               :data="data"                     //琛ㄦ牸鏄剧ず鐨勬暟鎹�
+               :page.sync="page"                //琛ㄦ牸鍒嗛〉閰嶇疆閫夐」(闇�瑕乻ync淇グ绗�)
+               :permission="permissionList"     //鏉冮檺鎺у埗
+               :before-open="beforeOpen"        //鎵撳紑鍓嶇殑鍥炶皟function(file,column)
+               v-model="form"                   //鏁版嵁妯″瀷 鐢ㄦ潵瀛樺彇椤甸潰鍊肩殑 
+               ref="crud"                       //鍦ㄦ櫘閫氱殑 DOM 鍏冪礌涓婁娇鐢紝寮曠敤鎸囧悜鐨勫氨鏄� DOM 鍏冪礌锛�
+               @cell-click="pageto"             //琛ㄦ牸鐐瑰嚮杩愯鏂规硶 onclick鏂规硶瀹氫箟
+               @row-update="rowUpdate"          //淇敼鏁版嵁鍚庣偣鍑荤‘瀹氳Е鍙戣浜嬩欢
+               @row-save="rowSave"              //鏂板鏁版嵁鍚庣偣鍑荤‘瀹氳Е鍙戣浜嬩欢
+               @row-del="rowDel"                //琛屾暟鎹垹闄ゆ椂瑙﹀彂璇ヤ簨浠�
+               @row-click="handleRowClick"      //鍗曞嚮琛岃繍琛岀殑鏂规硶
+               @search-change="searchChange"    //鎼滅储鏍忓彉鍖栦簨浠�
+               @search-reset="searchReset"      //娓呯┖鎼滅储鏍忓彉鍖栦簨浠�
+               @selection-change="selectionChange"//閫夋嫨妗嗗彉鍖栧彉鍖栦簨浠�
+               @current-change="currentChange"  //鐐瑰嚮椤电爜浼氳皟鐢╟urrent-change鏂规硶鍥炶皟褰撳墠椤垫暟锛岃繑鍥炲綋鍓嶇鍑犻〉
+               @size-change="sizeChange"       //鐐瑰嚮姣忛〉澶氬皯鏉′細璋僺ize-change鏂规硶鍥炶皟
+               @refresh-change="refreshChange" //鐐瑰嚮鍒锋柊鎸夐挳瑙﹀彂璇ヤ簨浠�
+               @on-load="onLoad">              //鎵撳紑琛ㄦ牸椤甸潰鐨勬柟娉曪紝涓�鑸敤鏉ュ垵濮嬪寲锛岃繑鍥為〉闈㈡暟鎹�
+          </avue-crud>
+
+option: {
+          height:'auto',                 //琛ㄦ牸楂樺害
+          emptyText: "鏆傛棤鏁版嵁鍝",       //鏁版嵁涓虹┖鐨勬彁绀�
+          calcHeight: 30,                //琛ㄦ牸楂樺害宸紙涓昏鐢ㄤ簬鍑忓幓鍏朵粬閮ㄥ垎璁╄〃鏍奸珮搴﹁嚜閫傚簲锛�
+          tip: false,                    //鎻愮ず淇℃伅
+          searchShow: true,              //棣栨鍔犺浇鏄惁鏄剧ず鎼滅储
+          searchMenuSpan: 4,             //鎼滅储鎸夐挳闀垮害
+          searchSpan:6,                  //鎼滅储妗嗛暱搴�  鏈�澶ч暱搴�24
+          border: true,                  //琛ㄦ牸杈规鏄惁鏄剧ず
+          index: true,                   //鏄惁鏄剧ず搴忓彿
+          viewBtn: true,                 //鏄惁鏄剧ず鏌ョ湅鎸夐挳
+          selection: true,               //鎼滅储妗嗘樉绀�
+          addBtn:false,                  //鏄惁鏄剧ず娣诲姞鎸夐挳
+          editBtn:false,                 //鏄惁鏄剧ず缂栬緫鎸夐挳
+          delBtn:false,                  //鏄惁鏄剧ず鍒犻櫎鎸夐挳
+          excelBtn:false,                //琛ㄦ牸瀵煎嚭鎸夐挳鏄惁鏄剧ず
+          labelWidth:120,                //琛ㄥ崟鍓嶉潰鐨勬爣棰橀暱搴�
+          refreshBtn: false,             //琛ㄦ牸涓婇潰灏忕殑 鍒锋柊鎸夐挳
+          columnBtn: false,              //琛ㄦ牸涓婇潰灏忕殑 鍒楄〃鎸夐挳
+          searchBtn: false,              //琛ㄦ牸涓婇潰灏忕殑 鎼滅储鎸夐挳
+          menu: true,                    //鏄惁鏄剧ず鎿嶄綔鏍�
+          defaultExpandAll:true,         //鏍戦粯璁ゅ睍寮�
+          column:[
+             {
+              label: "",                 //琛ㄥ崟灞炴�у悕绉�
+              prop: "",                  //灞炴�у搴斿疄浣撶被瀛楁
+              type: "",                  //杈撳叆妗嗙被鍨�
+              addDisplay: false,         //鏂板鏃舵槸鍚︽樉绀�
+              editDisplay: false,        //缂栬緫鏃舵槸鍚︽樉绀�
+              viewDisplay: true,         //璇︽儏鏃舵槸鍚︽樉绀�
+              hide: true,                //琛ㄥ崟鏌ヨ鏃舵槸鍚︽樉绀�
+              display: true,             //鍦ㄦ煡鐪嬶紝鏂板锛岀紪杈戦〉闈㈡槸鍚︽樉绀�
+              labelWidth:'100',	         //鏍囬鍚嶇О瀹藉害
+              span: 24,                  //24涓�鏉℃暟鎹崰涓�琛岋紝8涓�琛�3鏉℃暟鎹�
+              gutter:20,	             //椤归棿璺�
+              addDisabled: true,         //娣诲姞鐨勬椂鍊欎笉鑳戒慨鏀�
+              editDisabled: true,        //缂栬緫鐨勬椂鍊欎笉鑳戒慨鏀�
+              sortable:true,             //鎺掑簭鏂瑰紡鍒囨崲锛屽�掑簭銆佹搴忓垏鎹�
+              maxlength: 30,             //瀛楁暟闄愬埗
+              showWordLimit:true,        //鏄剧ず瀛楁暟闄愬埗
+              defaultExpandAll:true,     //鏍戦粯璁ゅ睍寮�
+              search锛歵rue,              //鏌ヨ鏄惁鏄剧ず
+              searchFilterable:true,     //select閫夋嫨妗嗗尮閰�
+              showColumn:false,          //鍒楁樉闅愪腑鏄惁鏈�
+              addDisplay: false,         // 娣诲姞寮圭獥涓嶆樉绀�
+              editDisplay: false,        // 缂栬緫寮圭獥涓嶆樉绀�
+              viewDisplay: false         // 鏌ョ湅寮圭獥涓嶆樉绀�
+              disabled:true,             //琛ㄥ崟item绂佺敤
+              row:'false/true',          //鏄惁鍗曠嫭鎴愯
+              rules:Obj,	             //楠岃瘉瑙勫垯
+              dicData:[],                //瀛楀吀
+			  dicUrl:'',	             //杩滅▼瀛楀吀鍦板潃
+			  dicMethod:'get/post'	     //瀛楀吀璇锋眰鏂瑰紡
+			  dicQuery:obj, 	         //瀛楀吀璇锋眰鏂瑰紡
+			  props:{
+				lable:'瀛楀吀鐨勫悕绉板睘鎬у��',
+				value:'瀛楀吀鐨勫�煎睘鎬у��',
+				children:'瀛楀吀鐨勫瓙灞炴�у��'
+			  },
+ 
+            }
+```
+
diff --git a/Source/plt-web/plt-web-ui/src/App.vue b/Source/plt-web/plt-web-ui/src/App.vue
index acf45e6..32b2829 100644
--- a/Source/plt-web/plt-web-ui/src/App.vue
+++ b/Source/plt-web/plt-web-ui/src/App.vue
@@ -40,6 +40,7 @@
 }
 .avue-dialog .el-dialog__body{
   padding: 20px;
+  margin-bottom: 20px !important;
 }
 .avue--detail .el-col{
   margin-bottom: 0;
@@ -92,4 +93,7 @@
 .tree-buttons .el-button{
   margin: 0 5px 5px 0;
 }
+.el-dialog__footer{
+  border-top: 1px solid #e9e7e7;
+}
 </style>
diff --git a/Source/plt-web/plt-web-ui/src/api/base/file/index.js b/Source/plt-web/plt-web-ui/src/api/base/file/index.js
new file mode 100644
index 0000000..a36c7c2
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/api/base/file/index.js
@@ -0,0 +1,12 @@
+import request from '@/router/axios';
+
+// 涓嬭浇鏂囦欢
+export const download = (data) => {
+  return request({
+    url: '/api/vciFileDownloadController/downloadByFileOidPost',
+    method: 'post',
+    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
+    responseType: 'blob',
+    data: data
+  })
+}
diff --git a/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js b/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js
index 102dc35..265f67a 100644
--- a/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js
+++ b/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js
@@ -18,3 +18,25 @@
     params: params,
   });
 }
+
+//鍚姩娴佺▼
+export const startProcess = (params) => {
+  let formData = new FormData()
+  for (let key in params) {
+    // 濡傛灉鏄� nodeUsers 瀵硅薄锛屽垯鐗规畩澶勭悊
+    if (key === 'nodeUsers' && typeof params[key] === 'object' && params[key] !== null) {
+      for (let innerKey in params[key]) {
+        formData.append(`${key}[${innerKey}]`, params[key][innerKey]);
+      }
+    } else {
+      // 闈瀗odeUsers灞炴�э紝鐩存帴娣诲姞鍒� formData 涓�
+      formData.append(key.replaceAll('"', ''), params[key]);
+    }
+  }
+  return request({
+    url: '/api/processDefineController/startProcess',
+    method: 'post',
+    data:formData
+  });
+}
+
diff --git a/Source/plt-web/plt-web-ui/src/api/system/user/api.js b/Source/plt-web/plt-web-ui/src/api/system/user/api.js
index 3e042a6..ce644b2 100644
--- a/Source/plt-web/plt-web-ui/src/api/system/user/api.js
+++ b/Source/plt-web/plt-web-ui/src/api/system/user/api.js
@@ -25,7 +25,7 @@
 // 瑙掕壊鍏ㄦ煡璇�
 export function gridRoles(page,limit) {
   return request({
-    url: "/api/roleQueryController/gridRoles",
+    url: "/api/roleQueryController/refDataGrid",
     method: "get",
     params:{
       page,limit
@@ -54,19 +54,19 @@
 }
 
 // 鏂板鎴愬憳
-export function addUser(data) {
+export function addUser(row) {
   return request({
-    url: "/api/roleQueryController/addUser",
+    url: "/api/userQueryController/addUser",
     method: "post",
-    data:data
+    data:row
   });
 }
 
 // 淇敼鎴愬憳
 export function updateUser(data) {
   return request({
-    url: "/api/roleQueryController/updateUser",
-    method: "post",
+    url: "/api/userQueryController/updateUser",
+    method: "put",
     data:data
   });
 }
@@ -74,8 +74,60 @@
 // 鍒犻櫎鎴愬憳
 export function deleteUser(params) {
   return request({
-    url: "/api/roleQueryController/deleteUser",
+    url: "/api/userQueryController/deleteUser",
     method: "delete",
     params
   });
 }
+
+//鑾峰彇瀵嗙爜绛栫暐
+export function selectPwdStrategyMap(params) {
+  return request({
+    url: "/api/passwordStrategyQueryController/selectPwdStrategyMap",
+    method: "get",
+    params
+  });
+}
+
+//淇濆瓨瀵嗙爜绛栫暐
+export function saveUserPasswordStrateg(params) {
+  let formData = new FormData()
+  for (let key in params){
+    formData.append(key,params[key])
+  }
+  return request({
+    url: "/api/passwordStrategyQueryController/saveUserPasswordStrateg",
+    method: "post",
+    data:formData
+  });
+}
+
+// 涓嬭浇妯℃澘鎺ュ彛
+export const download = (params) => {
+  return request({
+    url: '/api/userQueryController/downloadImportTemplate',
+    method: 'get',
+    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
+    responseType: 'blob',
+    params
+  })
+}
+
+//鑾峰彇瀵嗙爜绛栫暐
+export function departmentQueryController(params) {
+  return request({
+    url: "/api/departmentQueryController/refTree",
+    method: "get",
+    params
+  });
+}
+
+//鑾峰彇瀵嗙爜绛栫暐
+export function saveUsersDepts(params) {
+  return request({
+    url: "/api/departmentQueryController/saveUsersDepts",
+    method: "post",
+    params
+  });
+}
+
diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/Upload-files.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/Upload-files.vue
deleted file mode 100644
index 35b1b6d..0000000
--- a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/Upload-files.vue
+++ /dev/null
@@ -1,158 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="dialogVisible"
-    append-to-body
-    title="涓婁紶鏂囦欢"
-  >
-    <Divider left="30px" text="瀵煎叆鎻愮ず"></Divider>
-    <ul>
-      <li>
-        1.绾㈣壊瀛椾綋琛ㄧず蹇呰緭椤�
-      </li>
-      <li>
-        2.姣忔浠呰兘鏈�澶氬鍏�10000鏉℃暟鎹�
-      </li>
-    </ul>
-    <Divider left="30px" text="excel鏂囦欢锛岄�夋嫨鏂囦欢鍚庝細鑷姩涓婁紶"></Divider>
-    <el-upload
-      :before-upload="beforeUpload"
-      :headers="uploadHeaders"
-      :on-change="uploadChange"
-      :on-error="onError"
-      :on-success="onSuccess"
-      :show-file-list="false"
-      accept=".xlsx, .xls"
-      action="/api/ubcs-code/codeClassify/importClassify"
-      class="upload-demo">
-      <el-button size="small" style="margin: 15px 35px" type="primary">娴忚鏂囦欢</el-button>
-    </el-upload>
-    <template #footer>
-      <el-button
-        :loading="downloadLoading"
-        size="small"
-        type="primary"
-        @click="downloadTemplateFun"
-      >涓嬭浇瀵煎叆妯℃澘
-      </el-button
-      >
-      <el-button size="small" @click="dialogVisible = false">鍏抽棴</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script>
-// import {downloadErrorFile,downloadBatchImportApplyTemplate} from '@/api/template/templateAttr'
-import {getToken} from "@/util/auth";
-import func from "@/util/func";
-
-export default {
-  name: "Upload-files",
-  props: {
-    visible: {
-      type: Boolean,
-      default: false,
-    },
-    codeClassifyOid: {
-      type: String,
-      default: "",
-    },
-  },
-  data() {
-    return {
-      flga: true,
-      pageLoading: null,
-      downloadLoading: false,
-    }
-  },
-  watch: {
-    visible: {
-      handler(newval, oldval) {
-        // console.log('newval',newval)
-      }
-    }
-  },
-  computed: {
-    uploadHeaders() {
-      return {
-        "Blade-Auth": "bearer " + getToken(),
-      };
-    },
-    dialogVisible: {
-      get() {
-        return this.visible;
-      },
-      set(val) {
-        this.$emit("update:visible", val);
-      },
-    },
-  },
-  methods: {
-    //鏂囦欢涓婁紶鍓�
-    async beforeUpload(file) {
-      const fileType = file.name.split(".").pop();
-      if (fileType !== "xlsx" && fileType !== "xls") {
-        // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
-        this.$message.error("鍙厑璁镐笂浼爔lsx銆亁ls鏍煎紡鐨勬枃浠�");
-        return Promise.reject(false);
-      }
-      this.pageLoading = this.$loading({
-        lock: true,
-        text: "鏂囦欢涓婁紶涓�",
-        spinner: "el-icon-loading",
-        background: "rgba(0, 0, 0, 0.7)",
-      });
-      return true;
-    },
-    // 鏂囦欢涓婁紶鎴愬姛
-    onSuccess(resbonse) {
-      if (Object.keys(resbonse.data).length === 0) {
-        this.$message.success("涓婁紶鎴愬姛锛�");
-        this.dialogVisible = false;
-        return;
-      }
-      if (resbonse.data.fileOid) {
-        const fileName = resbonse.data.filePath.split("/").pop();
-        this.$message.error("璇蜂笅杞介敊璇俊鎭枃浠惰繘琛屾煡鐪嬶紒");
-        downloadErrorFile({uuid: resbonse.data.fileOid}).then((res) => {
-          func.downloadFileByBlobHandler(res);
-        });
-      }
-    },
-    //鐐瑰嚮涓嬭浇妯℃澘
-    downloadTemplateFun() {
-      this.downloadLoading = true;
-      downloadBatchImportApplyTemplate({codeClassifyOid: this.codeClassifyOid}).then(res => {
-        this.$utilFunc.downloadFileByBlob(res.data, "妯℃澘鏂囦欢.xls");
-        this.downloadLoading = false;
-      }).catch((res) => {
-        this.$message.warning(res)
-        this.downloadLoading = false;
-      })
-    },
-    //鏂囦欢涓婁紶澶辫触
-    onError(res) {
-      this.pageLoading.close();
-    },
-    //鏂囦欢鐘舵�佹敼鍙�
-    uploadChange(file) {
-      if (file.status === "success" || file.status === "error") {
-        this.pageLoading.close();
-      }
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-ul {
-  color: rgb(188, 188, 188);
-  margin: 20px 0 20px 0;
-  padding: 0 0 0 30px;
-  list-style: none;
-
-  li {
-    margin-bottom: 5px;
-    font-size: 13px;
-  }
-}
-</style>
diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue
index 8afee4f..68f7a40 100644
--- a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue
+++ b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue
@@ -1,59 +1,59 @@
 <template>
-    <el-dialog
-      v-dialogDrag
-      :close-on-click-modal="false"
-      :destroy-on-close="true"
-      :title="title"
-      :visible.sync="visible"
-      append-to-body="true"
-      class="avue-dialog"
-      style="text-align: center"
-      width="40%"
-      @close="dialogClose">
-      <el-transfer
-        v-model="rightRoleData"
-        v-loading="loading"
-        :data="data"
-        :filter-method="filterMethod"
-        :render-content="renderFunc"
-        :titles="['鐜版湁瑙掕壊', '鎷ユ湁瑙掕壊']"
-        filter-placeholder="瑙掕壊鍚嶇О鎼滅储"
-        filterable
-        style="text-align: left; display: inline-block;">
-      </el-transfer>
-      <span slot="footer" class="dialog-footer">
-    <el-button @click="visible = false">鍙� 娑�</el-button>
-    <el-button type="primary" @click="sendHandler">纭� 瀹�</el-button>
-  </span>
-    </el-dialog>
+  <el-dialog
+    v-dialogDrag
+    :close-on-click-modal="false"
+    :destroy-on-close="true"
+    :title="title"
+    :visible.sync="visible"
+    append-to-body="true"
+    class="avue-dialog"
+    style="text-align: center"
+    width="50%"
+    @close="dialogClose">
+    <el-transfer
+      v-model="rightRoleData"
+      v-loading="loading"
+      :data="data"
+      :filter-method="filterMethod"
+      :render-content="renderFunc"
+      :titles="transferTitle"
+      filter-placeholder="鍏抽敭璇嶆悳绱�"
+      filterable
+      style="text-align: left; display: inline-block;">
+    </el-transfer>
+    <div slot="footer" class="dialog-footer">
+      <div class="valueInfo" v-if="bottomValue">宸茶缃殑鍊间负锛歔{{bottomValue}}]</div>
+      <el-button @click="visible = false" size="small">鍙� 娑�</el-button>
+      <el-button type="primary" @click="sendHandler" size="small">纭� 瀹�</el-button>
+    </div>
+  </el-dialog>
 </template>
 
 <script>
 export default {
   name: "transfer",
-  props: ['title', 'leftRoleData', 'rightRoleData'],
+  props: ['title', 'leftRoleData', 'rightRoleData', 'transferTitle' , 'bottomValue'],
   data() {
     return {
       visible: false, // 閫氳繃 this.$refs.transfer.visible = true; 寮�鍚瓙缁勪欢瀵硅瘽妗�
       data: [],
-      value: [],
       loading: false,
       filterMethod(query, item) {
         return item.label.indexOf(query) > -1;
       },
       renderFunc(h, option) {
-        return <span><i class="el-icon-s-custom"></i> { option.label }</span>;
+        return <span><i class="el-icon-s-custom"></i> {option.label}</span>;
       }
     }
   },
   watch: {
     //娓叉煋绌挎妗�
     leftRoleData: {
-      handler(newval, oldval) {
+      handler(newval) {
         if (newval) {
           // 娓呯┖data鏁扮粍
           this.data = [];
-          newval.forEach((city, index) => {
+          newval.forEach((city) => {
             this.data.push({
               label: city.name,
               key: city.oid,
@@ -82,11 +82,20 @@
 </script>
 
 <style lang="scss" scoped>
-/deep/ .el-transfer-panel{ /* 宸﹀彸涓や釜绌挎妗嗙殑楂樺害鍜屽搴� */
-  height: 450px;
+/deep/ .el-transfer-panel {
+  height: 450px; /* 宸﹀彸涓や釜绌挎妗嗙殑楂樺害鍜屽搴� */
+  width: 300px;
 }
+
 /deep/ .el-transfer-panel__list.is-filterable {
   height: 323px; /* 绌挎妗嗗垪琛ㄩ珮搴� */
 }
-
+.valueInfo{
+  float: left;
+  border: 1px solid #E9E7E7;
+  display: inline-block;
+  vertical-align: middle;
+  padding: 6px 12px;
+  line-height: 1;
+}
 </style>
diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue
new file mode 100644
index 0000000..d75110c
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue
@@ -0,0 +1,146 @@
+<template>
+  <el-dialog
+    v-dialogDrag
+    :close-on-click-modal="false"
+    :destroy-on-close="true"
+    :title="title"
+    :visible.sync="visible"
+    width="40%"
+    append-to-body
+    class="avue-dialog"
+    style="margin-top: -20vh !important;"
+  >
+    <Divider left="30px" text="瀵煎叆鎻愮ず"></Divider>
+    <ul>
+      <li>
+        璇风偣鍑绘祻瑙堟枃浠惰繘琛屼笂浼�
+      </li>
+    </ul>
+    <Divider left="30px" text="閫夋嫨鏂囦欢鍚庝細鑷姩涓婁紶"></Divider>
+    <el-upload
+      :action="fileUrl"
+      :before-upload="beforeUpload"
+      :data="fileData"
+      :headers="uploadHeaders"
+      :on-change="uploadChange"
+      :on-error="onError"
+      :on-success="onSuccess"
+      :show-file-list="false"
+      class="upload-demo">
+      <el-button size="small" style="margin: 15px 35px" type="primary">娴忚鏂囦欢</el-button>
+    </el-upload>
+    <template #footer>
+      <el-button size="small" @click="visible = false">鍏抽棴</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import {getToken} from "@/util/auth";
+import func from "@/util/func";
+import {validatenull} from "@/util/validate";
+
+export default {
+  name: "upload-file",
+  props: {
+    fileType: {
+      type: Array,
+      default: () => []
+    },
+    title: {
+      type: String,
+      default: '涓婁紶鏂囦欢'
+    },
+    fileUrl: {
+      type: String,
+      default: ''
+    },
+    fileData: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      flga: true,
+      pageLoading: null,
+      downloadLoading: false,
+      visible: false,
+    }
+  },
+  created() {
+  },
+  watch: {
+    visible: {
+      handler(newval, oldval) {
+        // console.log('newval',newval)
+      }
+    }
+  },
+  computed: {
+    uploadHeaders() {
+      return {
+        "Authorizationtoken": getToken(),
+      };
+    },
+  },
+  methods: {
+    //鏂囦欢涓婁紶鍓�
+    async beforeUpload(file) {
+      // 鑾峰彇鏂囦欢鎵╁睍鍚�
+      const fileExtension = file.name.split(".").pop().toLowerCase(); // 杞崲涓哄皬鍐欎互閬垮厤澶у皬鍐欎笉鍖归厤鐨勯棶棰�
+      if (this.fileType) {
+        if (!this.fileType.includes(fileExtension)) {
+          // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
+          this.$message.error(`鍙厑璁镐笂浼�${this.fileType.toString()}鏍煎紡鐨勬枃浠禶);
+          return Promise.reject(false);
+        }
+      }
+      this.pageLoading = this.$loading({
+        lock: true,
+        text: "鏂囦欢涓婁紶涓�",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+
+      return true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛
+    onSuccess(resbonse) {
+      console.log(resbonse);
+      if (resbonse.code === 200) {
+        this.$message.success("瀵煎叆鎴愬姛锛�");
+        this.visible = false;
+      } else {
+        this.$message.error(resbonse.msg);
+      }
+    },
+    //鏂囦欢涓婁紶澶辫触
+    onError(res) {
+      this.pageLoading.close();
+      this.$message.error(res);
+    },
+    //鏂囦欢鐘舵�佹敼鍙�
+    uploadChange(file) {
+      console.log( this.pageLoading);
+      if (file.status === "success" || file.status === "error") {
+        this.pageLoading.close();
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+ul {
+  color: rgb(188, 188, 188);
+  margin: 20px 0 20px 0;
+  padding: 0 0 0 30px;
+  list-style: none;
+
+  li {
+    margin-bottom: 5px;
+    font-size: 13px;
+  }
+}
+</style>
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/StartWorkflowAction.js b/Source/plt-web/plt-web-ui/src/components/actions/base/StartWorkflowAction.js
index ddb084d..e81ff9b 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/base/StartWorkflowAction.js
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/StartWorkflowAction.js
@@ -8,7 +8,6 @@
 
 
 export const doAction = (options,callback) => {
-  //modelName 娴佺▼鍚嶇О 榛樿涓� 褰撳墠鐢ㄦ埛+'鍚姩娴佺▼'+褰撳墠鍒嗙被
   //multi 鏄惁寮�鍚閫�
   //checknotprocess 鏄惁鍏佽鍙戣捣娴佺▼
 
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/downLoadFile.vue b/Source/plt-web/plt-web-ui/src/components/actions/base/downLoadFile.vue
new file mode 100644
index 0000000..d9ba6e4
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/downLoadFile.vue
@@ -0,0 +1,13 @@
+<template>
+
+</template>
+
+<script>
+export default {
+  name: "downLoadFile"
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/downloadFileAction.js b/Source/plt-web/plt-web-ui/src/components/actions/base/downloadFileAction.js
index 4c6c358..85da8fe 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/base/downloadFileAction.js
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/downloadFileAction.js
@@ -5,8 +5,10 @@
 import {validatenull} from "@/util/validate";
 import Vue from "vue";
 import func from "@/util/func";
+import {download} from "@/api/base/file";
 
 export const doAction = (options,callback) => {
+  console.log(options)
   options.sourceData = options.sourceData || {};
   options.dataStore = options.dataStore || [];
   if (!options.dataStore || options.dataStore.length < 1) {
@@ -33,10 +35,22 @@
  */
 export const showStartWindow = (options,callback)=> {
   const paramVOS = options.paramVOS;
-  if (!paramVOS['form'] && !paramVOS['context']) {
-    Vue.prototype.$message.error("鎸夐挳閰嶇疆涓嶆纭�");
-    return false;
-  }
+  const oids = options.dataStore.map(item => item.oid).join(',');
+  let data = new FormData();
+  data.append('fileOid',oids);
+  download(data).then(res => {
+    console.log(res);
+    if (res) {
+      func.downloadFileByBlobHandler(res);
+      Vue.prototype.$message.success("涓嬭浇鎴愬姛");
+    }
+  }).catch(err => {
+    console.log(err);
+  });
+  // if (!paramVOS['form'] && !paramVOS['context']) {
+  //   Vue.prototype.$message.error("鎸夐挳閰嶇疆涓嶆纭�");
+  //   return false;
+  // }
   // func.downloadFileByBlobHandler();
 
 }
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue b/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue
index ac10977..b374b46 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue
@@ -6,14 +6,18 @@
              :width="width"
              append-to-body="true"
              class="avue-dialog"
-             style="margin-top: -10% !important;"
              title="鍚姩娴佺▼"
-             top="0"
              @close="dialogClose">
 
-    <el-form :model="saveParam" :rules="rules" class="demo-form-inline" label-position="left" label-width="auto">
+    <el-divider content-position="left">娴佺▼淇℃伅</el-divider>
+
+    <el-form ref="nodeForm" :model="saveParam" :rules="rules" class="demo-form-inline" label-position="left"
+             label-width="auto">
       <el-form-item label="娴佺▼妯℃澘">
-        <el-input v-model="saveParam.modelName" disabled placeholder="娴佺▼妯℃澘"></el-input>
+        <el-select v-model="saveParam.processTemplate" filterable style="width: 100%;" @change="proTemSelect($event)">
+          <el-option v-for="(item, key) in processTemplateList" :key="key" :label="item.value"
+                     :value="item.value"></el-option>
+        </el-select>
       </el-form-item>
       <el-form-item label="娴佺▼鍚嶇О" prop="processName">
         <el-input v-model="saveParam.processName" placeholder="娴佺▼鍚嶇О">
@@ -25,30 +29,33 @@
       </el-form-item>
     </el-form>
 
-    <el-divider></el-divider>
-    <!--    <div class="btns-icon">-->
-    <!--      <el-button circle icon="el-icon-star-off" @click="handleCollect"></el-button>-->
-    <!--    </div>-->
-    <el-form :model="collectParam" class="demo-form-inline" label-position="left" label-width="auto">
-      <el-form-item v-for="(item, index) in initFrom" :key="index" :label="`鑺傜偣${index + 1}`">
-        <el-select style="width: 100%;" filterable v-model="collectParam.flowTaskUsers[index]['userId']"
-                   :placeholder="item.value" @change="handleSelect($event, index)">
-          <el-option :label="key.name" :value="key.name" v-for="(key, keyi) in item.processNodes"
-                     :key="keyi"></el-option>
-        </el-select>
+    <el-divider content-position="left">娴佺▼鑺傜偣</el-divider>
+
+
+    <el-form :key="formKey" v-loading="nodeLoading" :model="collectParam" :rules="nodeRules" class="demo-form-inline"
+             label-position="left"
+             label-width="auto">
+      <el-form-item v-for="(item, index) in initFrom" :key="index" :label="item.name" prop="node">
+        <div @click="nodeChange(item)">
+          <el-input v-model="collectParam[item.name+'name']" readonly="true" suffix-icon="el-icon-zoom-in"></el-input>
+        </div>
       </el-form-item>
     </el-form>
-    <div slot="footer" class="dialog-footer">
-      <el-button @click="handleCancel">鍙� 娑�</el-button>
-      <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
-    </div>
 
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="handleCancel">鍙� 娑�</el-button>
+      <el-button size="small" type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+    </div>
+    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData"
+              :title="`涓恒��${this.nodeName}銆戦�夊彇鍊糮" :transferTitle="transferTitle" :bottomValue="bottomValue"
+              @transferSend="roleSendHandler"></transfer>
   </el-dialog>
+
 </template>
 
 <script>
 import {validatenull} from "@/util/validate";
-import {getTemplateByType, getAllProcessNode} from "@/api/base/startWork/index"
+import {getTemplateByType, getAllProcessNode, startProcess} from "@/api/base/startWork/index"
 
 export default {
   name: "startWorkFlow",
@@ -71,34 +78,67 @@
   data() {
     return {
       visible: false,
-      saveParam: {}, // 瀵硅薄鍖呭惈 {modelName娴佺▼妯℃澘(鐢辨帴鍙h繑鍥炲綋鍓嶆祦绋嬫ā鏉�) , processName娴佺▼鍚嶇О锛堜负褰撳墠鐢ㄦ埛+'鍚姩娴佺▼'+褰撳墠鍒嗙被锛� , processDesc娴佺▼鎻忚堪 }
+      saveParam: {
+        processName: ''
+      }, // 瀵硅薄鍖呭惈 {processTemplate娴佺▼妯℃澘(鐢辨帴鍙h繑鍥炲綋鍓嶆祦绋嬫ā鏉�) , processName娴佺▼鍚嶇О锛堜负褰撳墠鐢ㄦ埛+'鍚姩娴佺▼'+褰撳墠鍒嗙被锛� , processDesc娴佺▼鎻忚堪 }
+      processTemplateList: [], // 娴佺▼妯℃澘涓嬫媺鏁扮粍
       initFrom: [],  // 褰撳墠娴佺▼鑺傜偣寰幆鏁扮粍
       collectParam: {}, // 娴佺▼鑺傜偣涓嬫媺妗嗗弻鍚戠粦瀹氬睘鎬�
       typeName: [], // 娴佺▼鑺傜偣option寰幆閫夐」
+      nodeLoading: false,
       rules: {
         processName: [
           {required: true, message: '娴佺▼鍚嶇О涓嶈兘涓虹┖', trigger: 'blur'},
           {min: 3, max: 50, message: '闀垮害鍦� 3 鍒� 50 涓瓧绗�', trigger: 'blur'}
         ]
-      }
+      },
+      nodeRules: {
+        node: [
+          {required: true, message: '閫夋嫨鍐呭涓嶈兘涓虹┖', trigger: 'change'},
+        ]
+      },
+      bottomValue:'',
+      leftRoleData: [],
+      rightRoleData: [],
+      transferTitle: [],
+      nodeName: '', // 褰撳墠鑺傜偣鍚嶇О
+      userVo: [
+        {
+          "children": [],
+          "id": "zkjs",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "1241AC3B-26AF-9B86-7870-53DA8D78A742",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "1",
+          "leaf": true,
+          "name": "娴嬭瘯",
+          "oid": "921D71F8-C2BB-3BCE-B744-AD0C3812F41A",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "5",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "34ddb5a8-ab95-4070-b72f-abaaa48cf8b1",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        }
+      ],
+      formKey: 0,
+
     }
   },
-  watch: {
-    users: {
-      handler(val) {
-        this.collectParam.flowTaskUsers = val
-      },
-      deep: true,
-      immediate: true
-    },
-    parameter: {
-      handler(newval, oldval) {
-        this.saveParam = Object.assign({processName: '', processDesc: '',}, newval);
-      },
-      deep: true,
-      immediate: true
-    }
-  },
+  watch: {},
   computed: {
     fullscreen() {
       if (this.paramVOS.width || this.paramVOS.height) {
@@ -121,7 +161,7 @@
     },
   },
   created() {
-    this.modelNameChange();
+    // this.modelNameChange();
     this.getWorkByType();
   },
   mounted() {
@@ -131,30 +171,43 @@
     getWorkByType() {
       let params = {
         type: '鏂囨。瀹$娴佺▼',
-        filterTemplate: ""
+        filterTemplate: "鏂囨。瀹$娴佺▼"
       }
       getTemplateByType(params).then(res => {
         const data = res.data.data;
-        data.forEach(item => {
-          this.getProcessNode(item);
-        })
-        this.initFrom = data;
-      }).catch(error => {
-        console.log(error);
+        const userInfo = JSON.parse(localStorage.getItem('saber-userInfo'));
+
+        this.processTemplateList = data;
+        this.saveParam.processTemplate = data[0].value;
+        this.saveParam.processName = this.paramVOS.processName || userInfo.content.userName + '-' + data[0].value; // 瀵规祦绋嬫ā鏉� 娴佺▼鍚嶇О璧嬮粯璁ゅ��
+
+        this.getProcessNode(data[0].attributes.oid); // 棣栨杩涘叆璋冪敤绗竴涓ā鏉跨殑鎵�鏈夎妭鐐�
+      }).catch(err => {
+        this.$message.error(err);
       })
     },
 
     // 璇锋眰娴佺▼鑺傜偣
-    getProcessNode(item) {
+    getProcessNode(oid) {
       let params = {
-        processOid: item.attributes.oid,
+        processOid: oid,
         maxSecret: -1
       }
       getAllProcessNode(params).then(res => {
         const nodes = res.data.data;
-        item.processNodes = nodes;
-      }).catch(error => {
-        console.log(error);
+        this.initFrom = nodes;
+        nodes.forEach(item => {
+          // let name = item.processUserVO[0].children.map(name => name.name).join(',');
+          // let ids = item.processUserVO[0].children.map(id => id.id).join(',');
+          let name = this.userVo.map(name => name.name).join(',');
+          let ids = this.userVo.map(id => id.id).join(',');
+          this.bottomValue = name;
+          this.collectParam[item.name + 'name'] = name;
+          this.collectParam[item.name] = ids;
+        })
+        this.nodeLoading = false;
+      }).catch(err => {
+        this.$message.error(err);
       })
     },
 
@@ -163,38 +216,109 @@
       this.visible = false;
     },
 
-    handleSelect() {
-
-    },
-
-    handleCollect() {
-
-    },
 
     handleCancel() {
       this.dialogClose();
     },
 
     handleConfirm() {
-      console.log(this.initFrom);
+      const oids = this.dataStore.map(item => item.oid).join(',');
+      let params = {
+        deployid:this.processTemplateList[0].attributes.deploymentId,
+        title:this.saveParam.processName,
+        description:this.saveParam.processDesc,
+        btmType:this.processTemplateList[0].attributes.taskType,
+        uiType:this.processTemplateList[0].attributes.taskType,
+        oids:oids, // 褰撳墠鏁版嵁oid锛屽涓敤,鍒嗛殧
+        detailInfoUrl:this.paramVOS.detailInfoUrl || '', // 鐢ㄦ埛閰嶇疆灞炴��
+        resetStatus:'Editing',
+        nodeUsers:{
+          ...this.collectParam
+        }
+      }
+      startProcess(params).then(res => {
+        if(res.data.obj.status === 200){
+          this.dialogClose();
+          this.$message.success('鍚姩娴佺▼鎴愬姛');
+        }else {
+          this.$message.error(res.data.obj.error);
+        }
+      }).catch(err => {
+        this.$message.error(err);
+      })
     },
 
-    //  娴佺▼鍚嶇О鍒濆鍖栫粦瀹�
-    modelNameChange() {
-      var userInfo = JSON.parse(localStorage.getItem('saber-userInfo'));
+    // 鍒囨崲娴佺▼妯℃澘
+    proTemSelect(event) {
+      this.nodeLoading = true;
+      this.getProcessNode(event);
+      this.$refs.nodeForm.clearValidate();
+    },
 
-      if (this.paramVOS && this.paramVOS.modelName) {
-        this.saveParam.modelName = this.paramVOS.modelName;
-      } else if (userInfo.content && userInfo.content.userName) {
-        this.saveParam.modelName = userInfo.content.userName + '鍚姩娴佺▼';
-      } else {
-        this.saveParam.modelName = '';
-      }
-    }
+    // 鑺傜偣鐐瑰嚮浜嬩欢
+    nodeChange(item) {
+      this.nodeName = item.name;
+      this.transferTitle = [`[${item.name}]鏈�夌敤鎴穈, `[${item.name}]宸查�夌敤鎴穈]
+      this.leftRoleData = [
+        {
+          "children": [],
+          "id": "zkjs",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "1241AC3B-26AF-9B86-7870-53DA8D78A742",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "1",
+          "leaf": true,
+          "name": "娴嬭瘯",
+          "oid": "921D71F8-C2BB-3BCE-B744-AD0C3812F41A",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "5",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "34ddb5a8-ab95-4070-b72f-abaaa48cf8b1",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        }
+      ];
+      this.rightRoleData = this.userVo.map(item => item.oid);
+      this.$refs.transfer.visible = true;
+    },
+
+    // 绌挎妗嗗洖濉�
+    roleSendHandler(data) {
+      let filterData;
+      filterData = this.userVo.filter(item => {
+        return data.includes(item.oid);
+      });
+      const filterName = filterData.map(item => item.name).join(',');
+      this.$set(this.collectParam, this.nodeName + 'name', filterName);
+      this.formKey += 1; // 鍒锋柊琛ㄥ崟 鍥犱负鍙屽悜缁戝畾鐨則his.collectParam[this.nodeName + 'name']鏄姩鎬佸�� vue鏃犳硶妫�娴嬪埌鍊肩殑鏇存柊
+    },
   }
 }
 </script>
 
 <style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 25px;
+}
 
+.el-divider--horizontal {
+  margin-bottom: 20px !important;
+}
+
+.el-divider__text.is-left {
+  color: #8b8989 !important;
+}
 </style>
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue b/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue
index 433d92d..6b73c7c 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue
@@ -1,45 +1,35 @@
 <template>
   <el-dialog
     v-dialogDrag
-    :width="width"
-    :visible.sync="visible"
-    :destroy-on-close="true"
     :close-on-click-modal="false"
+    :destroy-on-close="true"
+    :visible.sync="visible"
+    :width="width"
     append-to-body
-    title="涓婁紶鏂囦欢"
     class="avue-dialog"
+    title="涓婁紶鏂囦欢"
+    style="margin-top: -20vh !important;"
   >
     <Divider left="30px" text="瀵煎叆鎻愮ず"></Divider>
     <ul>
       <li>
-        1.绾㈣壊瀛椾綋琛ㄧず蹇呰緭椤�
-      </li>
-      <li>
-        2.姣忔浠呰兘鏈�澶氬鍏�10000鏉℃暟鎹�
+        璇风偣鍑绘祻瑙堟枃浠惰繘琛屼笂浼�
       </li>
     </ul>
-    <Divider left="30px" text="excel鏂囦欢锛岄�夋嫨鏂囦欢鍚庝細鑷姩涓婁紶"></Divider>
+    <Divider left="30px" text="閫夋嫨鏂囦欢鍚庝細鑷姩涓婁紶"></Divider>
     <el-upload
       :before-upload="beforeUpload"
+      :data="fileData"
       :headers="uploadHeaders"
       :on-change="uploadChange"
       :on-error="onError"
       :on-success="onSuccess"
       :show-file-list="false"
-      accept=".xlsx, .xls"
-      action="/api/ubcs-code/codeClassify/importClassify"
+      action="/api/vciFileUploadController/uploadFile"
       class="upload-demo">
       <el-button size="small" style="margin: 15px 35px" type="primary">娴忚鏂囦欢</el-button>
     </el-upload>
     <template #footer>
-      <el-button
-        :loading="downloadLoading"
-        size="small"
-        type="primary"
-        @click="downloadTemplateFun"
-      >涓嬭浇瀵煎叆妯℃澘
-      </el-button
-      >
       <el-button size="small" @click="visible = false">鍏抽棴</el-button>
     </template>
   </el-dialog>
@@ -74,8 +64,11 @@
       flga: true,
       pageLoading: null,
       downloadLoading: false,
-      visible:false,
+      visible: false,
     }
+  },
+  created() {
+    console.log(this.sourceData);
   },
   watch: {
     visible: {
@@ -87,8 +80,17 @@
   computed: {
     uploadHeaders() {
       return {
-        "Blade-Auth": "bearer " + getToken(),
+        "Authorizationtoken": getToken(),
       };
+    },
+    fileData() {
+      return {
+        ownbizOid: this.sourceData.oid,
+        ownBtmName: this.sourceData.btmname,
+        secretGrade: -1,
+        fileDocClassify: '',
+        updateFileFlag: true,
+      }
     },
     width() {
       if (!validatenull(this.paramVOS.width)) {
@@ -98,14 +100,14 @@
           return this.paramVOS.width + "px";
         }
       } else {
-        return "60%";
+        return "40%";
       }
     },
-    fullscreen(){
+    fullscreen() {
       console.log(this.paramVOS)
-      if(this.paramVOS.width || this.paramVOS.height){
+      if (this.paramVOS.width || this.paramVOS.height) {
         return false;
-      }else if(this.paramVOS.form){
+      } else if (this.paramVOS.form) {
         return false;
       }
       return true;
@@ -114,49 +116,39 @@
   methods: {
     //鏂囦欢涓婁紶鍓�
     async beforeUpload(file) {
-      const fileType = file.name.split(".").pop();
-      if (fileType !== "xlsx" && fileType !== "xls") {
-        // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
-        this.$message.error("鍙厑璁镐笂浼爔lsx銆亁ls鏍煎紡鐨勬枃浠�");
-        return Promise.reject(false);
+      // 鑾峰彇鏂囦欢鎵╁睍鍚�
+      const fileExtension = file.name.split(".").pop().toLowerCase(); // 杞崲涓哄皬鍐欎互閬垮厤澶у皬鍐欎笉鍖归厤鐨勯棶棰�
+
+      if(this.paramVOS.fileType){
+        if (!this.paramVOS.fileType.includes(fileExtension)) {
+          // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
+          this.$message.error(`鍙厑璁镐笂浼�${this.paramVOS.fileType.toString()}鏍煎紡鐨勬枃浠禶);
+          return Promise.reject(false);
+        }
       }
+
       this.pageLoading = this.$loading({
         lock: true,
         text: "鏂囦欢涓婁紶涓�",
         spinner: "el-icon-loading",
         background: "rgba(0, 0, 0, 0.7)",
       });
+
       return true;
     },
     // 鏂囦欢涓婁紶鎴愬姛
     onSuccess(resbonse) {
-      if (Object.keys(resbonse.data).length === 0) {
+      if (resbonse.code === 200) {
         this.$message.success("涓婁紶鎴愬姛锛�");
         this.dialogVisible = false;
-        return;
+      }else {
+        this.$message.error(resbonse.msg);
       }
-      if (resbonse.data.fileOid) {
-        const fileName = resbonse.data.filePath.split("/").pop();
-        this.$message.error("璇蜂笅杞介敊璇俊鎭枃浠惰繘琛屾煡鐪嬶紒");
-        downloadErrorFile({uuid: resbonse.data.fileOid}).then((res) => {
-          func.downloadFileByBlobHandler(res);
-        });
-      }
-    },
-    //鐐瑰嚮涓嬭浇妯℃澘
-    downloadTemplateFun() {
-      this.downloadLoading = true;
-      downloadBatchImportApplyTemplate({codeClassifyOid: this.codeClassifyOid}).then(res => {
-        this.$utilFunc.downloadFileByBlob(res.data, "妯℃澘鏂囦欢.xls");
-        this.downloadLoading = false;
-      }).catch((res) => {
-        this.$message.warning(res)
-        this.downloadLoading = false;
-      })
     },
     //鏂囦欢涓婁紶澶辫触
     onError(res) {
       this.pageLoading.close();
+      this.$message.error(res);
     },
     //鏂囦欢鐘舵�佹敼鍙�
     uploadChange(file) {
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFileAction.js b/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFileAction.js
index b486c54..13c4f04 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFileAction.js
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFileAction.js
@@ -5,12 +5,16 @@
 import {validatenull} from "@/util/validate";
 import Vue from "vue";
 import uploadFileDialog from "@/components/actions/base/uploadFile"
+import func from "@/util/func";
 
 
 export const doAction = (options,callback) => {
   options.sourceData = options.sourceData || {};
   options.dataStore = options.dataStore || [];
-
+  if (func.isEmptyObject(options.sourceData)) {
+    Vue.prototype.$message.error("璇烽�夋嫨瑕佷笂浼犵殑鍒嗙被锛�");
+    return false;
+  }
   callPreEvent(options, doBefore, function (options) {
     showStartWindow(options, function () {
       callPostEvent(options, doAfter, callback,type);
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/handlers.js b/Source/plt-web/plt-web-ui/src/components/actions/handlers.js
index b3685d3..31752f6 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/handlers.js
+++ b/Source/plt-web/plt-web-ui/src/components/actions/handlers.js
@@ -35,7 +35,7 @@
     uploadfile: () => {import("@/components/actions/base/uploadFileAction").then(module => {
       module.doAction(options,callback);
     })},
-    //涓婁紶鏂囦欢
+    //涓嬭浇鏂囦欢
     downloadfile: () => {import("@/components/actions/base/downloadFileAction").then(module => {
       module.doAction(options,callback);
     })},
diff --git a/Source/plt-web/plt-web-ui/src/main.js b/Source/plt-web/plt-web-ui/src/main.js
index 5471b03..05e9ed2 100644
--- a/Source/plt-web/plt-web-ui/src/main.js
+++ b/Source/plt-web/plt-web-ui/src/main.js
@@ -39,7 +39,7 @@
 // 瀵屾枃鏈粍浠�
 import richText from '@/components/PLT-basic-component/richText'
 // 涓婁紶鏂囦欢缁勪欢
-import UploadFiles from  '@/components/PLT-basic-component/Upload-files'
+import uploadFile from '@/components/PLT-basic-component/upload-file'
 // 琛ㄥ崟涓婁紶鏂囦欢缁勪欢
 import formUpload from "@/components/PLT-basic-component/formUpload";
 // 绌挎妗嗙粍浠�
@@ -56,7 +56,7 @@
 Vue.component('dynamicTableForm', dynamicTableForm);
 Vue.component('dynamicForm', dynamicForm);
 Vue.component('richText', richText);
-Vue.component('UploadFiles', UploadFiles);
+Vue.component('uploadFile', uploadFile);
 Vue.component('formUpload', formUpload);
 Vue.component('Divider', Divider);
 Vue.component('transfer', transfer);
diff --git a/Source/plt-web/plt-web-ui/src/util/basic-option.js b/Source/plt-web/plt-web-ui/src/util/basic-option.js
index aa2feb4..1c2b03c 100644
--- a/Source/plt-web/plt-web-ui/src/util/basic-option.js
+++ b/Source/plt-web/plt-web-ui/src/util/basic-option.js
@@ -7,8 +7,11 @@
   searchIcon:true,
   selection:true,
   stripe:true,
+  headerAlign: 'center',
+  align: 'center',
   // selection 鏄惁鏈夐�夋嫨妗�
   // indexFixed:true/left/right, 鍥哄畾鍒�
   // menu:false, 鏄惁鏈夋搷浣滄爮
   // menuTitle:xxx, 鎿嶄綔鏍忔爣棰�
+  // stripe 鏉$汗
 }
diff --git a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
index 45970cc..1970aa3 100644
--- a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
@@ -2,6 +2,7 @@
   <basic-container>
     <avue-crud
       ref="userCrud"
+      :before-open="beforeOpen"
       :data="tableData"
       :option="option"
       :page.sync="page"
@@ -14,7 +15,29 @@
       @current-change="currentChange"
       @selection-change="selectChange"
       @row-click="rowClickHandler"
+      @row-save="rowSaveHandler"
+      @row-update="rowUpdateHandler"
     >
+      <!-- 閮ㄩ棬澶撮儴鎼滅储鎻掓Ы  -->
+      <template slot-scope="{disabled,size}" slot="pkDepartmentNameSearch">
+        <div style="display: flex;gap: 5px">
+          <el-select v-model="departSearchValue" clearable placeholder="璇烽�夋嫨閮ㄩ棬">
+            <el-option :label="departSearchObj.name" :value="departSearchObj.oid"></el-option>
+          </el-select>
+          <el-button size="small" type="success" @click="dialogDepartSearchHandler">閫夋嫨閮ㄩ棬</el-button>
+        </div>
+      </template>
+
+      <!-- 瀵硅瘽妗嗛儴闂ㄦ彃妲�     -->
+      <template slot="pkDepartmentNameForm" slot-scope="scope">
+        <div style="display: flex;gap: 5px">
+          <el-select v-model="departValue" clearable placeholder="璇烽�夋嫨閮ㄩ棬">
+            <el-option :label="departObj.name" :value="departObj.oid"></el-option>
+          </el-select>
+          <el-button size="small" type="success" @click="dialogDepartHandler">閫夋嫨閮ㄩ棬</el-button>
+        </div>
+      </template>
+
       <template slot="status" slot-scope="{row}">
         <el-tag v-if="row.status === 0" type="success">鍚敤</el-tag>
         <el-tag v-if="row.status === 1" type="danger">鍋滅敤</el-tag>
@@ -26,40 +49,157 @@
       </template>
 
       <template #menu="{row,index,size}">
-        <el-button size="small" type="text" @click="stopUserHandler(row)">
+        <el-button icon="el-icon-edit" size="small" type="text" @click.stop="rowEditHandler(row,index)">缂栬緫</el-button>
+        <el-button icon="el-icon-delete" size="small" type="text" @click.stop="rowDeleteHandler(row)">鍒犻櫎</el-button>
+        <el-button size="small" type="text" @click.stop="stopUserHandler(row)">
           <span v-if="row.status === 0" style="color: #fa3434"><i class="el-icon-video-pause"></i> 鍋滅敤</span>
           <span v-if="row.status === 1" style="color: #55b61d"><i class="el-icon-video-pause"></i> 鍚敤</span>
         </el-button>
       </template>
 
       <template slot="menuLeft" slot-scope="scope">
-        <el-button icon="el-icon-delete" plain size="small" type="danger">鍒犻櫎</el-button>
+        <el-button icon="el-icon-delete" plain size="small" type="danger" @click="allDelHandler">鍒犻櫎</el-button>
         <el-button icon="el-icon-user" plain size="small" type="primary" @click="roleHandler">鍒嗛厤瑙掕壊</el-button>
-        <el-button icon="el-icon-school" plain size="small" type="primary">鍒嗛厤閮ㄩ棬</el-button>
-        <el-button icon="el-icon-key" plain size="small" type="success">璁剧疆瀵嗙爜绛栫暐</el-button>
-        <el-button icon="el-icon-upload2" plain size="small" type="primary">瀵煎叆浜哄憳</el-button>
-        <el-button icon="el-icon-download" plain size="small" type="primary">涓嬭浇瀵煎叆妯℃澘</el-button>
+        <el-button icon="el-icon-school" plain size="small" type="primary" @click="departmentHandler">鍒嗛厤閮ㄩ棬</el-button>
+        <el-button icon="el-icon-key" plain size="small" type="success" @click="setPwsHandler">璁剧疆瀵嗙爜绛栫暐</el-button>
+        <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="uploadRole">瀵煎叆浜哄憳</el-button>
+        <el-button icon="el-icon-download" plain size="small" type="primary" @click="downloadHandler">涓嬭浇瀵煎叆妯℃澘</el-button>
       </template>
     </avue-crud>
-    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData" title="鍒嗛厤瑙掕壊"
-              @transferSend="roleSendHandler"></transfer>
+
+    <!-- 鍒嗛厤瑙掕壊绌挎妗�   -->
+    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData"
+              :transferTitle="transferTitle" title="鍒嗛厤瑙掕壊"
+              @transferSend="roleSendHandler">
+    </transfer>
+
+    <!-- 璁剧疆瀵嗙爜绛栫暐瀵硅瘽妗�   -->
+    <el-dialog
+      v-dialogDrag
+      v-loading="pwdLoading"
+      :destroy-on-close="true"
+      :visible.sync="pwdVisible"
+      append-to-body="true"
+      class="avue-dialog"
+      style="margin-top: -15vh !important;"
+      title="璁剧疆瀵嗙爜绛栫暐"
+      width="30%"
+    >
+
+      <div class="password-strategy-container">
+        <div><i class="el-icon-setting"/>璁剧疆瀵嗙爜绛栫暐锛�</div>
+        <el-select v-model="pwdValue" placeholder="璇烽�夋嫨瀵嗙爜绛栫暐">
+          <el-option v-for="(item,index) in pwdList" :key="index" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="pwdVisible = false">鍙� 娑�</el-button>
+        <el-button size="small" type="primary" @click="savePwdHandler">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 瀵煎叆浜哄憳   -->
+    <upload-file ref="upload" :fileType="upFileType" :fileUrl="fileUrl" title="瀵煎叆浜哄憳"></upload-file>
+
+    <!-- 鍒嗛厤閮ㄩ棬瀵硅瘽妗�    -->
+    <el-dialog
+      v-dialogDrag
+      v-loading="departLoading"
+      :destroy-on-close="true"
+      :visible.sync="departVisible"
+      append-to-body="true"
+      class="avue-dialog"
+      title="鍒嗛厤閮ㄩ棬"
+      width="50%"
+    >
+      <avue-crud
+        ref="departCrud"
+        :data="departData"
+        :option="departOption"
+        @current-row-change="handleCurrentRowChange"
+      >
+      </avue-crud>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="departVisible = false">鍙� 娑�</el-button>
+        <el-button size="small" type="primary" @click="saveDepartHandler">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
   </basic-container>
 </template>
 
 <script>
 import basicOption from '@/util/basic-option'
-import {getDataUsers, stopUser, gridRoles, listRoleByUserOid, saveRights, addUser, updateUser, deleteUser} from '@/api/system/user/api'
+import {
+  getDataUsers,
+  stopUser,
+  gridRoles,
+  listRoleByUserOid,
+  saveRights,
+  addUser,
+  updateUser,
+  deleteUser,
+  selectPwdStrategyMap,
+  saveUserPasswordStrateg,
+  download,
+  departmentQueryController,
+  saveUsersDepts
+} from '@/api/system/user/api'
 import {column} from "./option"
 import func from '@/util/func'
 
 export default {
   name: "userManage",
-  data() {
+  data: function () {
     return {
+      departSearchObj:{},
+      departSearchValue:'',
+      loadKey: 0,
+      departStatus: '', // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+      departValue: '', // 閮ㄩ棬瀵硅瘽妗嗕笅鎷夋缁戝畾鍊�
+      departObj: {},  // 閮ㄩ棬瀵硅瘽妗嗕笅鎷夋閫夐」缁戝畾鍊�
+      departCurrenRow: {},
+      departOption: {
+        ...basicOption,
+        rowKey: 'oid',
+        rowParentKey: 'parentId',
+        selection: false,
+        highlightCurrentRow: true,
+        stripe: false,
+        menu: false,
+        refreshBtn: false,
+        gridBtn: false,
+        column: [
+          {
+            label: '鍚嶇О',
+            prop: 'name',
+          },
+          {
+            label: '缂栧彿',
+            prop: 'id',
+          },
+          {
+            label: '鎻忚堪',
+            prop: 'description',
+          },
+        ]
+      },
+      departData: [],
+      departLoading: false,
+      departVisible: false,
+      upFileType: ['xls', 'xlsx'],
+      fileUrl: 'api/userQueryController/importUser',
+      pwdVisible: false,
+      pwdLoading: false,
+      pwdValue: '',
+      pwdList: [],
       tableLoading: false,
       tableData: [],
       option: {
         ...basicOption,
+        editBtn: false,
+        delBtn: false,
+        dialogWidth: '50%',
         calcHeight: -60,
         column: column
       },
@@ -71,13 +211,22 @@
       },
       searchParams: {},
       selectList: [],
-      leftRoleData: [],  // 鍒嗛厤瑙掕壊绌挎妗嗗乏渚ч粯璁ゆ暟鎹�
-      rightRoleData: [], // 鍒嗛厤瑙掕壊绌挎妗嗗彸渚ч粯璁ゆ暟鎹�
+      leftRoleData: [],  // 鍒嗛厤瑙掕壊绌挎妗嗗乏渚у垵濮嬫暟鎹�
+      rightRoleData: [], // 鍒嗛厤瑙掕壊绌挎妗嗗彸渚у垵濮嬫暟鎹�
+      transferTitle: ['鐜版湁瑙掕壊', '鎷ユ湁瑙掕壊']
     }
   },
   created() {
   },
   methods: {
+    // 鏂板鎴栦慨鏀瑰璇濇鎵撳紑鍓�
+    beforeOpen(done, type) {
+      if(type == 'add'){
+        this.departObj = {};
+        this.departValue = "";
+      }
+      done();
+    },
     // 琛ㄦ牸璇锋眰
     getTableList() {
       this.tableLoading = true;
@@ -98,6 +247,11 @@
 
     // 鎼滅储鏌ヨ
     handleSearch(params, done) {
+      this.searchParams = {};
+      if(this.departSearchObj && this.departSearchValue){
+        this.searchParams['conditionMap["pkDepartment"]'] = this.departSearchValue;
+      }
+
       if (!func.isEmptyObject(params)) {
         for (let key in params) {
           if (params.hasOwnProperty(key)) {
@@ -106,15 +260,20 @@
             this.searchParams[`conditionMap["${newKey}"]`] = params[key];
           }
         }
-      } else {
+      }
+
+      if (func.isEmptyObject(params) && !this.departSearchValue) {
         this.searchParams = {};
       }
+
       this.getTableList();
       done();
     },
 
     // 閲嶇疆鎼滅储鏉′欢
     handleReset() {
+      this.departSearchObj = {};
+      this.departSearchValue = "";
       this.searchParams = {};
       this.getTableList();
     },
@@ -182,7 +341,7 @@
     // 绌挎妗嗙粍浠跺洖濉�
     roleSendHandler(row) {
       let params = {
-        userOid: this.selectList[0].oid,
+        userOids: this.selectList[0].oid,
         roleIds: row.join(',')
       }
       saveRights(params).then(res => {
@@ -191,12 +350,256 @@
       }).catch(err => {
         this.$message.error(err)
       })
-    }
+    },
+
+    // 璁剧疆瀵嗙爜绛栫暐
+    setPwsHandler() {
+      if (this.selectList.length <= 0) {
+        this.$message.warning('娓呭厛閫夋嫨浜哄憳鍐嶈繘琛屾搷浣滐紒')
+        return;
+      }
+      this.pwdLoading = false;
+      selectPwdStrategyMap().then(res => {
+        if (res.data.code === 200) {
+          this.pwdList = res.data.data;
+          this.pwdValue = res.data.data[0].id;
+          console.log(res.data)
+          this.pwdVisible = true;
+          this.pwdLoading = false;
+        } else {
+          this.$message.error(res.data.msg);
+        }
+      })
+    },
+
+    // 淇濆瓨瀵嗙爜绛栫暐
+    savePwdHandler() {
+      let params = {
+        userIds: this.selectList.map(item => item.oid).join(','),
+        passwordStrategId: this.pwdValue
+      }
+      saveUserPasswordStrateg(params).then(res => {
+        this.pwdVisible = false;
+        this.$message.success(res.data.obj)
+      }).catch(err => {
+        this.$message.error(err)
+      })
+    },
+
+    // 鏂板
+    rowSaveHandler(row, done) {
+      if (row.password != row.confirmPassword) {
+        this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒')
+        return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
+      }
+      row.pkDepartment = this.departValue; // 灏嗗綋鍓嶈鐨勯儴闂ㄥ弬鏁皃kDepartment 璧嬪�间负涓嬫媺妗嗙粦瀹氱殑鍊�
+      addUser(row).then(res => {
+        if (res.data.code === 200) {
+          this.$message.success(res.data.obj);
+          this.getTableList();
+        }
+      }).catch(err => {
+        console.log(err);
+      })
+      done()
+    },
+
+    // 鎿嶄綔鏍忕紪杈�
+    rowEditHandler(row, index) {
+      let obj = { name: row.pkDepartmentName, oid: row.pkDepartment, rowOid: row.oid };
+      this.departValue = row.pkDepartment;
+      this.departObj = obj;
+
+      if (this.departObj.rowOid) {
+        this.$refs.userCrud.rowEdit(row, index);
+      }
+
+    },
+
+    // 缂栬緫
+    rowUpdateHandler(row, index, done) {
+      if (row.password != row.confirmPassword) {
+        this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒')
+        return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
+      }
+      row.pkDepartment = this.departValue; // 灏嗗綋鍓嶈鐨勯儴闂ㄥ弬鏁皃kDepartment 璧嬪�间负涓嬫媺妗嗙粦瀹氱殑鍊�
+      updateUser(row).then(res => {
+        if (res.data.code === 200) {
+          this.$message.success(res.data.obj);
+          this.getTableList();
+        }
+      }).catch(err => {
+        console.log(err);
+      });
+      done()
+    },
+
+    // 鍒犻櫎
+    rowDeleteHandler(row) {
+      let params = {
+        ids: row.oid
+      }
+      deleteUser(params).then(res => {
+        if (res.data.code === 200) {
+          this.$message.success(res.data.obj);
+          this.getTableList();
+        }
+      }).catch(err => {
+        console.log(err);
+      })
+    },
+
+    // 澶氶�夊垹闄�
+    allDelHandler() {
+      let params = {
+        ids: this.selectList.map(item => item.oid).join(',')
+      }
+      if (this.selectList.length <= 0) {
+        this.$message.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹繘琛屽垹闄わ紒')
+        return;
+      }
+      this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎鎵�閫夋嫨鐨勬垚鍛樺悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteUser(params).then(res => {
+          if (res.data.code === 200) {
+            this.$message.success(res.data.obj);
+            this.getTableList();
+          }
+        });
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+
+    // 涓嬭浇瀵煎叆妯℃澘
+    downloadHandler() {
+      download().then(res => {
+        console.log(res);
+        func.downloadFileByBlobHandler(res);
+        this.$message.success('涓嬭浇鎴愬姛')
+      }).catch(err => {
+        this.$message.error(err);
+      })
+    },
+
+    // 瀵煎叆浜哄憳
+    uploadRole() {
+      this.$refs.upload.visible = true;
+    },
+
+    // 鍒嗛厤閮ㄩ棬
+    departmentHandler() {
+      if (this.selectList.length <= 0) {
+        this.$message.warning('娓呭厛閫夋嫨浜哄憳鍐嶈繘琛屾搷浣滐紒')
+        return;
+      }
+      this.departStatus = 'default'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+      this.departmentQueryOnLoad();
+    },
+
+    // 鍒嗛厤閮ㄩ棬琛ㄦ牸鍒濆鍖栬姹�
+    departmentQueryOnLoad() {
+      departmentQueryController({queryAllLevel: true}).then(res => {
+        const data = res.data.treeData;
+        this.departData = this.departDtaFormAtter(data);
+        this.departVisible = true;
+      }).catch(err => {
+        this.$message.error(err);
+      })
+    },
+
+    // 鍒嗛厤閮ㄩ棬鏁版嵁杞崲
+    departDtaFormAtter(items) {
+      return items.map(item => {
+        // 杞崲褰撳墠鑺傜偣鐨勫睘鎬�
+        const formList = {
+          oid: item.oid,
+          id: item.attributes.id,
+          name: item.attributes.name,
+          description: item.attributes.description,
+          parentId: item.parentId,
+          parentName: item.parentName,
+          parentBtmName: item.parentBtmName,
+          // 濡傛灉children瀛樺湪涓斾笉涓虹┖锛屽垯閫掑綊杞崲children
+          children: item.children && item.children.length > 0 ? this.departDtaFormAtter(item.children) : undefined
+        };
+        return formList;
+      });
+    },
+
+    // 鍒嗛厤閮ㄩ棬 琛屽崟閫�
+    handleCurrentRowChange(row) {
+      this.departCurrenRow = row;
+    },
+
+    // 鍒嗛厤閮ㄩ棬 淇濆瓨
+    saveDepartHandler() {
+      if (func.isEmptyObject(this.departCurrenRow)) {
+        this.$message.warning('璇烽�夋嫨閮ㄩ棬鑺傜偣锛�')
+        return;
+      }
+
+      if (this.departStatus == 'default') {
+        let params = {
+          userOIds: this.selectList.map(item => item.oid).join(','),
+          deptId: this.departCurrenRow.oid,
+        };
+        saveUsersDepts(params).then(res => {
+          if (res.data.code === 200) {
+            this.departVisible = false;
+            this.getTableList();
+            this.$message.success('鍒嗛厤鎴愬姛锛�')
+          }
+        }).catch(err => {
+          console.log(err);
+        })
+        return;
+      }
+
+      if (this.departStatus == 'handle') {
+        this.departObj = this.departCurrenRow;
+        this.departValue = this.departCurrenRow.oid;
+        this.departVisible = false;
+        return;;
+      }
+
+      if(this.departStatus == 'search'){
+        this.departSearchObj =  this.departCurrenRow;
+        this.departSearchValue =  this.departCurrenRow.oid;
+        this.departVisible = false;
+        return;
+      }
+    },
+
+    // 瀵硅瘽妗嗗垎閰嶉儴闂ㄦ寜閽�
+    dialogDepartHandler() {
+      this.departmentQueryOnLoad();
+      this.departStatus = 'handle'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+    },
+
+    // 鎼滅储瀵硅瘽妗嗗垎閰嶉儴闂ㄦ寜閽�
+    dialogDepartSearchHandler(){
+      this.departmentQueryOnLoad();
+      this.departStatus = 'search'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+    },
   }
 
 }
 </script>
 
-<style scoped>
+<style lang="scss" scoped>
+.password-strategy-container {
+  padding-left: 20px;
+  display: flex;
+  //justify-content: center;
+  align-items: center;
+  gap: 10px;
+}
 
 </style>
diff --git a/Source/plt-web/plt-web-ui/src/views/system/user/option.js b/Source/plt-web/plt-web-ui/src/views/system/user/option.js
index 0602863..07f7c2b 100644
--- a/Source/plt-web/plt-web-ui/src/views/system/user/option.js
+++ b/Source/plt-web/plt-web-ui/src/views/system/user/option.js
@@ -1,21 +1,64 @@
-export const column = [
+export let column = [
+  {
+    label: '璐﹀彿',
+    prop: 'id',
+    search:true,
+    sortable:true,
+    rules: [
+      {
+        required: true,
+        message: '璇疯緭鍏ュ鍚�',
+        trigger: 'blur'
+      }
+    ]
+  },
   {
     label: '濮撳悕',
     prop: 'name',
-    align:'center',
     search:true,
-    sortable:true
-  }, {
-    label: '璐﹀彿',
-    prop: 'id',
-    align:'center',
-    search:true,
-    sortable:true
+    sortable:true,
+    rules: [
+      {
+        required: true,
+        message: '璇疯緭鍏ュ鍚�',
+        trigger: 'blur'
+      }
+    ]
+  },
+  {
+    label: '瀵嗙爜',
+    prop: 'password',
+    hide:true,
+    type:'password',
+    change: (val)=>{
+      const confirmPasswordColumn = column.find(item => item.prop === 'confirmPassword');
+      confirmPasswordColumn.disabled = val.value === "";
+    },
+    rules: [
+      {
+        required: true,
+        message: '璇疯緭鍏ュ瘑鐮�',
+        trigger: 'blur'
+      }
+    ]
+  },
+  {
+    label: '纭瀵嗙爜',
+    prop: 'confirmPassword',
+    hide:true,
+    type:'password',
+    disabled:true,
+    rules: [
+      {
+        required: true,
+        message: '璇峰啀娆$‘璁ゅ瘑鐮�',
+        trigger: 'blur'
+      }
+    ]
   },
   {
     label: '鐘舵��',
     prop: 'status',
-    align: 'center',
     display:false,
     sortable:true,
     slot: true,
@@ -29,7 +72,6 @@
   {
     label: '閿佸畾鐘舵��',
     prop: 'lockFlag',
-    align:'center',
     sortable:true,
     display:false,
   },
@@ -40,19 +82,18 @@
     search:true,
     sortable:true,
     searchslot:true,
+    formslot:true,
   },
   {
     label: '涓撲笟',
     prop: 'specialties',
-    align:'center',
     sortable:true,
   },
   {
     label: '瑙掕壊',
     prop: 'pkPersonName',
-    align:'center',
     type:'select',
-    dicUrl: 'api/roleQueryController/gridRoles',
+    dicUrl: 'api/roleQueryController/refDataGrid',
     props: {
       label: 'name',
       value: 'oid'
@@ -65,28 +106,27 @@
   {
     label: '鐢靛瓙閭欢',
     prop: 'email',
-    align:'center',
     sortable:true,
+    overHidden: true,
+    row:true
   },
   {
     label: '鎻忚堪',
     type:'textarea',
     prop: 'description',
-    align:'center',
     sortable:true,
+    overHidden: true,
   },
   {
     label: '閮ㄩ棬棰嗗',
     prop: 'isDeptLeader',
-    align:'center',
     sortable:true,
     display:false,
   },
   {
     label: '鎵�灞炲瘑绾�',
     prop: 'secretGradeText',
-    align:'center',
     sortable:true,
     display:false,
-  }
+  },
 ];
diff --git a/Source/plt-web/plt-web-ui/vue.config.js b/Source/plt-web/plt-web-ui/vue.config.js
index 133f96c..4cf35ab 100644
--- a/Source/plt-web/plt-web-ui/vue.config.js
+++ b/Source/plt-web/plt-web-ui/vue.config.js
@@ -26,7 +26,9 @@
     proxy: {
       '/api': {
         //鏈湴鏈嶅姟鎺ュ彛鍦板潃
-        target: 'http://localhost:12000/web',
+        // target: 'http://localhost:12000/web',
+        target: 'http://192.168.0.105:12005/web', // yxc
+        // target: 'http://192.168.0.103:12005/web', // ldc
         // target: 'http://dev.vci-tech.com:37000',
         //杩滅▼婕旂ず鏈嶅姟鍦板潃,鍙敤浜庣洿鎺ュ惎鍔ㄩ」鐩�
         //target: 'https://saber.bladex.vip/api/',

--
Gitblit v1.9.3