فهرست منبع

Merge branch 'dev_v2' of http://106.15.120.127:3000/GoldenTech/koyo_crm into dev_v2

jubs 2 ماه پیش
والد
کامیت
dc33930e84
30فایلهای تغییر یافته به همراه539 افزوده شده و 322 حذف شده
  1. 10 0
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/controller/train/TtTrainController.java
  2. 6 5
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/controller/train/TtTrainTargetController.java
  3. 5 5
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/domain/train/TtTrainTarget.java
  4. 9 1
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/domain/vo/train/TrainFileDetailRes.java
  5. 2 0
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/domain/vo/train/TrainParticipantRes.java
  6. 2 1
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/enums/train/TrainStatusEnum.java
  7. 2 0
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/mapper/TtFileDatabaseMapper.java
  8. 2 0
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/ITtTrainService.java
  9. 1 1
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/ITtTrainTargetService.java
  10. 5 0
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtFileDatabaseServiceImpl.java
  11. 17 5
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtTrainFileServiceImpl.java
  12. 10 1
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtTrainServiceImpl.java
  13. 13 14
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtTrainTargetServiceImpl.java
  14. 2 0
      RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/train/ITtFileDatabaseService.java
  15. 3 0
      RuoYi-Vue-fast-master/src/main/resources/mybatis/business/train/TtFileDatabaseMapper.xml
  16. 2 2
      RuoYi-Vue-fast-master/src/main/resources/mybatis/business/train/TtTrainFileMapper.xml
  17. 2 1
      RuoYi-Vue-fast-master/src/main/resources/mybatis/business/train/TtTrainMapper.xml
  18. 9 0
      ruoyi-ui-vue2/src/api/train/target.js
  19. 9 0
      ruoyi-ui-vue2/src/api/train/train.js
  20. 18 0
      ruoyi-ui-vue2/src/utils/fileFormart.js
  21. 4 0
      ruoyi-ui-vue2/src/utils/lang/en-us.js
  22. 4 0
      ruoyi-ui-vue2/src/utils/lang/es-es.js
  23. 4 0
      ruoyi-ui-vue2/src/utils/lang/ru-ru.js
  24. 5 0
      ruoyi-ui-vue2/src/utils/lang/zh-cn.js
  25. 225 216
      ruoyi-ui-vue2/src/views/crmManagement/elevatorModel/index.vue
  26. 35 5
      ruoyi-ui-vue2/src/views/train/trainTarget/index.vue
  27. 47 11
      ruoyi-ui-vue2/src/views/train/trainTarget/participateTrain/index.vue
  28. 17 6
      ruoyi-ui-vue2/src/views/train/trainlist/detail/addTrain.vue
  29. 22 13
      ruoyi-ui-vue2/src/views/train/trainlist/detail/trainDetail.vue
  30. 47 35
      ruoyi-ui-vue2/src/views/train/trainlist/index.vue

+ 10 - 0
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/controller/train/TtTrainController.java

@@ -99,6 +99,16 @@ public class TtTrainController extends BaseController {
     }
 
     /**
+     * 删除培训考核
+     */
+    @Log(title = "培训考核", businessType = BusinessType.DELETE)
+    @PutMapping("/terminateTrain/{ids}")
+    @DataUpdateCheck(key="id",tableName = "tt_train")
+    public AjaxResult terminateTrain(@PathVariable Long[] ids) {
+        return toAjax(ttTrainService.updateTtTrainStatusByIds(ids));
+    }
+
+    /**
      * 查询当前用户培训考核一览
      */
     @GetMapping("/participantTrainPage")

+ 6 - 5
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/controller/train/TtTrainTargetController.java

@@ -68,7 +68,7 @@ public class TtTrainTargetController extends BaseController {
     }
 
     /**
-     * 修改考核对象
+     * 修改考核
      */
     @Log(title = "考核对象", businessType = BusinessType.UPDATE)
     @PutMapping
@@ -78,15 +78,16 @@ public class TtTrainTargetController extends BaseController {
     }
 
     /**
-     * 修改考核对象
+     * 修改学院培训状态
      */
     @Log(title = "考核对象", businessType = BusinessType.UPDATE)
-    @PutMapping("/editByTrainId")
+    @PutMapping("/editTargetStatus")
     @DataUpdateCheck(key="id",tableName = "tt_train_target")
-    public AjaxResult editByTrainId(@RequestBody TtTrainTarget ttTrainTarget) {
-        return toAjax(ttTrainTargetService.updateTtTrainTargetByTrainId(ttTrainTarget));
+    public AjaxResult editTargetStatus(@RequestBody TtTrainTarget ttTrainTarget) {
+        return toAjax(ttTrainTargetService.updateEditTargetStatus(ttTrainTarget));
     }
 
+
     /**
      * 删除考核对象
      */

+ 5 - 5
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/domain/train/TtTrainTarget.java

@@ -49,11 +49,11 @@ public class TtTrainTarget extends BaseEntity {
     @Excel(name = "是否考核完成", readConverterExp = "0=:未完成,1=:已完成")
     private String assessCompleteFlag;
 
-    /**
-     * 是否考核通过(0:未通过  1:通过)
-     */
-    @Excel(name = "是否考核通过", readConverterExp = "0=:未通过,1=:通过")
-    private String passFlag;
+//    /**
+//     * 是否考核通过(0:未通过  1:通过)
+//     */
+//    @Excel(name = "是否考核通过", readConverterExp = "0=:未通过,1=:通过")
+//    private String passFlag;
 
     /**
      * 删除标记(0:未删除  1:已删除)

+ 9 - 1
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/domain/vo/train/TrainFileDetailRes.java

@@ -3,12 +3,15 @@ package com.ruoyi.project.business.domain.vo.train;
 import com.ruoyi.project.business.domain.train.TtFileDatabase;
 import com.ruoyi.project.business.domain.train.TtTrain;
 import com.ruoyi.project.business.domain.train.TtTrainFile;
+import com.ruoyi.project.business.domain.train.TtTrainTarget;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+import java.util.Date;
+
 /**
  * @author : fangk
  * @date : 2024/7/5 13:53
@@ -40,14 +43,19 @@ public class TrainFileDetailRes {
 
     private TtTrain train;
 
+    /**
+     * tt_train_target 表更新时间 用于checkData
+     */
+    private Date updateTime;
 
-    public static TrainFileDetailRes from(TtTrainFile ttTrainFile, TtFileDatabase file, TtTrain train) {
+    public static TrainFileDetailRes from(TtTrainFile ttTrainFile, TtFileDatabase file, TtTrain train, TtTrainTarget ttTrainTarget) {
         return TrainFileDetailRes.builder()
                 .id(ttTrainFile.getId())
                 .fileId(ttTrainFile.getFileId())
                 .trainId(ttTrainFile.getTrainId())
                 .file(file)
                 .train(train)
+                .updateTime(ttTrainTarget.getUpdateTime())
                 .build();
     }
 }

+ 2 - 0
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/domain/vo/train/TrainParticipantRes.java

@@ -97,4 +97,6 @@ public class TrainParticipantRes {
 
 
     private String remark;
+
+    private String ttTargetId;
 }

+ 2 - 1
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/enums/train/TrainStatusEnum.java

@@ -13,7 +13,8 @@ public enum TrainStatusEnum {
 
     NOT_START("00","未开始"),
     STARTED("01","已开始"),
-    ENDED("02","已结束");
+    ENDED("02","已结束"),
+    TERMINATION("03","已终止");
 
 
     private final String code;

+ 2 - 0
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/mapper/TtFileDatabaseMapper.java

@@ -24,6 +24,8 @@ public interface TtFileDatabaseMapper extends BaseMapper<TtFileDatabase> {
     List<FileDatabaseRes> selectTtFileDatabaseList(FileDatabaseReq req);
 
     boolean editVisibleRange(FileDataVisibleRangeVo vo);
+
+    TtFileDatabase selectTtFileDatabaseById(Long trainId);
 }
 
 

+ 2 - 0
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/ITtTrainService.java

@@ -75,4 +75,6 @@ public interface ITtTrainService extends IService<TtTrain> {
     List<TtTrainTargetVo> selectTrainResult(TtTrainDto ttTrainDto);
 
     void updateTrainStatus();
+
+    int updateTtTrainStatusByIds(Long[] ids);
 }

+ 1 - 1
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/ITtTrainTargetService.java

@@ -62,5 +62,5 @@ public interface ITtTrainTargetService extends IService<TtTrainTarget> {
      */
     int deleteTtTrainTargetById(Long id);
 
-    int updateTtTrainTargetByTrainId(TtTrainTarget ttTrainTarget);
+    int updateEditTargetStatus(TtTrainTarget ttTrainTarget);
 }

+ 5 - 0
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtFileDatabaseServiceImpl.java

@@ -243,6 +243,11 @@ public class TtFileDatabaseServiceImpl extends ServiceImpl<TtFileDatabaseMapper,
         return baseMapper.editVisibleRange(vo);
     }
 
+    @Override
+    public TtFileDatabase selectTtFileDatabaseById(Long trainId) {
+        return baseMapper.selectTtFileDatabaseById(trainId);
+    }
+
 }
 
 

+ 17 - 5
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtTrainFileServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.enums.DelFlag;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.file.FileUploadKoyoUtils;
 import com.ruoyi.common.utils.file.FileUtils;
 import com.ruoyi.framework.redis.RedisCache;
@@ -13,10 +14,12 @@ import com.ruoyi.project.business.domain.dto.TempPdfFileDto;
 import com.ruoyi.project.business.domain.train.TtFileDatabase;
 import com.ruoyi.project.business.domain.train.TtTrain;
 import com.ruoyi.project.business.domain.train.TtTrainFile;
+import com.ruoyi.project.business.domain.train.TtTrainTarget;
 import com.ruoyi.project.business.domain.vo.train.TrainFileDetailRes;
 import com.ruoyi.project.business.mapper.TtTrainFileMapper;
 import com.ruoyi.project.business.service.ITtTrainFileService;
 import com.ruoyi.project.business.service.ITtTrainService;
+import com.ruoyi.project.business.service.ITtTrainTargetService;
 import com.ruoyi.project.business.service.train.ITtFileDatabaseService;
 import com.ruoyi.project.config.AppConfig;
 import lombok.RequiredArgsConstructor;
@@ -44,7 +47,9 @@ public class TtTrainFileServiceImpl extends ServiceImpl<TtTrainFileMapper, TtTra
     private final ITtFileDatabaseService fileDatabaseService;
 
     private final ITtTrainService ttTrainService;
-    
+
+    private final ITtTrainTargetService ttTrainTargetService;
+
     // private final RedisTemplate<String, Object> redisTemplate;
     
     private final RedisCache redisCache;
@@ -180,18 +185,25 @@ public class TtTrainFileServiceImpl extends ServiceImpl<TtTrainFileMapper, TtTra
         }
 
         // 查询对应的 TtFileDatabase
-        TtFileDatabase file = fileDatabaseService.getOne(Wrappers.lambdaQuery(TtFileDatabase.class).eq(TtFileDatabase::getId, one.getFileId()));
-        Assert.notNull(file, "培训资料文件不存在");
+//        TtFileDatabase file = fileDatabaseService.getOne(Wrappers.lambdaQuery(TtFileDatabase.class)
+//                .eq(TtFileDatabase::getId, one.getFileId()).last(" or del_flag = 1"));
+//        Assert.notNull(file, "培训资料文件不存在");
+        TtFileDatabase file = fileDatabaseService.selectTtFileDatabaseById(trainId);
 
         // 查询对应的 TtTrain
-        TtTrain train = ttTrainService.getById(trainId);
+        TtTrain train = ttTrainService.getById(one.getId());
+
+        // 查询对应的 TtTrainTarget
+         TtTrainTarget target = ttTrainTargetService.getOne(Wrappers.lambdaQuery(TtTrainTarget.class)
+                 .eq(TtTrainTarget::getTrainId, trainId)
+                 .eq(TtTrainTarget::getTargetPersonId, SecurityUtils.getLoginUser().getUserId()));
 
         // 如果是 Word 文件,需要转换为 PDF 文件
         if (isWordFile(file)) {
             handleWordFileConversion(file);
         }
 
-        return TrainFileDetailRes.from(one, file, train);
+        return TrainFileDetailRes.from(one, file, train,target);
     }
 
     private boolean isWordFile(TtFileDatabase file) {

+ 10 - 1
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtTrainServiceImpl.java

@@ -640,7 +640,7 @@ public class TtTrainServiceImpl extends ServiceImpl<TtTrainMapper, TtTrain> impl
         // 查询所有未开始 和 已开始的培训
         QueryWrapper<TtTrain> queryWrapper = new QueryWrapper<>();
         queryWrapper.ne("train_status", TrainStatusEnum.ENDED.getCode());
-        queryWrapper.eq("del_flag", "0");
+        queryWrapper.ne("train_status", TrainStatusEnum.TERMINATION.getCode());
         List<TtTrain> ttTrains = ttTrainMapper.selectList(queryWrapper);
         // 遍历所有未开始 和 已开始的培训
         Date currentDate = new Date();
@@ -663,4 +663,13 @@ public class TtTrainServiceImpl extends ServiceImpl<TtTrainMapper, TtTrain> impl
         // 批量更新培训状态
         ttTrainMapper.updateBatchById(ttTrainList);
     }
+
+    @Override
+    public int updateTtTrainStatusByIds(Long[] ids) {
+        QueryWrapper<TtTrain> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("id", Arrays.asList(ids));
+        TtTrain ttTrain = new TtTrain();
+        ttTrain.setTrainStatus(TrainStatusEnum.TERMINATION.getCode());
+        return ttTrainMapper.update(ttTrain,queryWrapper);
+    }
 }

+ 13 - 14
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/impl/TtTrainTargetServiceImpl.java

@@ -94,20 +94,19 @@ public class TtTrainTargetServiceImpl extends ServiceImpl<TtTrainTargetMapper, T
         return ttTrainTargetMapper.deleteTtTrainTargetById(id);
     }
 
+    /**
+     * 更新考核对象状态为,已完成
+     * @param ttTrainTarget
+     * @return
+     */
     @Override
-    public int updateTtTrainTargetByTrainId(TtTrainTarget ttTrainTarget) {
-        // 获取登录人
-        Long loginUserId = SecurityUtils.getLoginUser().getUserId();
-        QueryWrapper<TtTrainTarget> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("train_id", ttTrainTarget.getTrainId());
-        queryWrapper.eq("target_person_id", loginUserId);
-
-        // 更新考核对象
-        TtTrainTarget updateEntity = new TtTrainTarget();
-        // 设置 培训完成
-        updateEntity.setTrainCompleteFlag(TrainCompleteFlagEnum.FINISHED.getCode());
-
-
-        return ttTrainTargetMapper.update(updateEntity, queryWrapper);
+    public int updateEditTargetStatus(TtTrainTarget ttTrainTarget) {
+        TtTrainTarget query = new TtTrainTarget();
+        query.setId(ttTrainTarget.getId());
+        query.setTrainCompleteFlag(TrainCompleteFlagEnum.FINISHED.getCode());
+        query.setUpdateBy(SecurityUtils.getLoginUser().getUserId().toString());
+        query.setUpdateTime(DateUtils.getNowDate());
+        return ttTrainTargetMapper.updateById(query);
     }
+
 }

+ 2 - 0
RuoYi-Vue-fast-master/src/main/java/com/ruoyi/project/business/service/train/ITtFileDatabaseService.java

@@ -50,6 +50,8 @@ public interface ITtFileDatabaseService extends IService<TtFileDatabase> {
 
     boolean editVisibleRange(FileDataVisibleRangeVo fileDataVisibleRangeVo);
 
+    TtFileDatabase selectTtFileDatabaseById(Long trainId);
+
 
     /**
      * 根据id获取详情

+ 3 - 0
RuoYi-Vue-fast-master/src/main/resources/mybatis/business/train/TtFileDatabaseMapper.xml

@@ -136,4 +136,7 @@
         </if>
 
     </select>
+    <select id="selectTtFileDatabaseById" resultType="com.ruoyi.project.business.domain.train.TtFileDatabase">
+        SELECT * FROM tt_file_database WHERE id = #{id}
+    </select>
 </mapper>

+ 2 - 2
RuoYi-Vue-fast-master/src/main/resources/mybatis/business/train/TtTrainFileMapper.xml

@@ -23,13 +23,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <sql id="selectTtTrainFileVoWithFileName">
         select f.*, d.file_name
         from tt_train_file f
-        left join tt_file_database d on d.id = f.file_id and d.del_flag != '1'
+        left join tt_file_database d on d.id = f.file_id
     </sql>
 
     <select id="selectTtTrainFileList" parameterType="TtTrainFile" resultType="com.ruoyi.project.business.domain.train.TtTrainFile">
         <include refid="selectTtTrainFileVoWithFileName"/>
         <where>
-            f.del_flag != '1'
+            f.del_flag = '0'
             <if test="fileId != null "> and f.file_id = #{fileId}</if>
             <if test="trainId != null "> and f.train_id = #{trainId}</if>
         </where>

+ 2 - 1
RuoYi-Vue-fast-master/src/main/resources/mybatis/business/train/TtTrainMapper.xml

@@ -166,7 +166,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             tt.assess_complete_flag,
             tt.train_complete_flag,
             t.remark,
-            tt.total_score
+            tt.total_score,
+            tt.id as tt_target_id
         from tt_train t
             join tt_train_target tt on t.id = tt.train_id and tt.del_flag != '1'
             left join sys_user u on t.create_by = u.user_id and u.del_flag != '1'

+ 9 - 0
ruoyi-ui-vue2/src/api/train/target.js

@@ -35,6 +35,15 @@ export function updateTarget(data) {
   })
 }
 
+// 修改【请填写功能名称】
+export function editTargetStatus(data) {
+  return request({
+    url: '/train/target/editTargetStatus',
+    method: 'put',
+    data: data
+  })
+}
+
 // 删除【请填写功能名称】
 export function delTarget(id) {
   return request({

+ 9 - 0
ruoyi-ui-vue2/src/api/train/train.js

@@ -52,6 +52,15 @@ export function delTrain(id) {
     method: 'delete'
   })
 }
+
+// 终止【终止培训】
+export function terminateTrain(id) {
+  return request({
+    url: '/train/train/terminateTrain/' + id,
+    method: 'put'
+  })
+}
+
 // 查询【请填写功能名称】列表
 export function participantTrainPage(query) {
   return request({

+ 18 - 0
ruoyi-ui-vue2/src/utils/fileFormart.js

@@ -0,0 +1,18 @@
+// 支持的图片格式
+const SUPPORT_IMAGE_FORMAT = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp'])
+// 支持的视频格式
+const SUPPORT_VIDEO_FORMAT = new Set(['mp4', 'avi', 'mov', 'rmvb', 'rm', 'flv', '3gp', 'wmv', 'mkv'])
+// 支持的音频格式
+const SUPPORT_AUDIO_FORMAT = new Set(['mp3', 'wav', 'wma', 'ogg', 'ape', 'acc', 'flac'])
+// 支持的文件格式汇总
+const SUPPORT_FILE_FORMAT = new Set(
+  [
+    'pdf','ppt','pptx','doc', 'docx', 'xlsx', 'xls',
+    ...SUPPORT_IMAGE_FORMAT,
+    ...SUPPORT_VIDEO_FORMAT,
+    ...SUPPORT_AUDIO_FORMAT
+  ])
+
+export {
+  SUPPORT_FILE_FORMAT
+}

+ 4 - 0
ruoyi-ui-vue2/src/utils/lang/en-us.js

@@ -1122,6 +1122,10 @@
     assessCompleteNum:"考核完成人数_US",
     complianceRate:"达标率_US",
     trainExportFileName:"培训数据_US",
+    editTrain:"编辑培训_US",
+    terminate:"终止培训_US",
+    isTerminate:"是否确认终止_US",
+    fileTypeError:"文件格式不正确,请上传以下格式文件:.pdf、.doc、.docx、.xls、.xlsx、.ppt、.pptx、.mp3、.mp7_US",
   },
   question: {
     questionContext:"题目名称_US",

+ 4 - 0
ruoyi-ui-vue2/src/utils/lang/es-es.js

@@ -1122,6 +1122,10 @@
     assessCompleteNum:"考核完成人数_ES",
     complianceRate:"达标率_ES",
     trainExportFileName:"培训数据_ES",
+    editTrain:"编辑培训_ES",
+    terminate:"终止培训_ES",
+    isTerminate:"是否确认终止_ES",
+    fileTypeError:"文件格式不正确,请上传以下格式文件:.pdf、.doc、.docx、.xls、.xlsx、.ppt、.pptx、.mp3、.mp6_ES",
   },
   question: {
     questionContext:"题目名称_ES",

+ 4 - 0
ruoyi-ui-vue2/src/utils/lang/ru-ru.js

@@ -1122,6 +1122,10 @@
     assessCompleteNum:"考核完成人数_RU",
     complianceRate:"达标率_RU",
     trainExportFileName:"培训数据_RU",
+    editTrain:"编辑培训_RU",
+    terminate:"终止培训_RU",
+    isTerminate:"是否确认终止_RU",
+    fileTypeError:"文件格式不正确,请上传以下格式文件:.pdf、.doc、.docx、.xls、.xlsx、.ppt、.pptx、.mp3、.mp5_RU",
   },
   question: {
     questionContext:"题目名称_RU",

+ 5 - 0
ruoyi-ui-vue2/src/utils/lang/zh-cn.js

@@ -1122,6 +1122,11 @@
     assessCompleteNum:"考核完成人数",
     complianceRate:"达标率",
     trainExportFileName:"培训数据",
+    editTrain:"编辑培训",
+    terminate:"终止培训",
+    isTerminate:"是否确认终止",
+    fileTypeError:"文件格式不正确,请上传以下格式文件:.pdf、.doc、.docx、.xls、.xlsx、.ppt、.pptx、.mp3、.mp4",
+    finished:"培训已完成",
   },
   question: {
     questionContext:"题目名称",

+ 225 - 216
ruoyi-ui-vue2/src/views/crmManagement/elevatorModel/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <card-table :modalData="libraryList"  labelWidth="120px" :searchParams="queryParams" @pagination="getListNew" @selection-change="handleSelectionChange" :loading="loading"
+    <card-table :modalData="libraryList" labelWidth="120px" :searchParams="queryParams" @pagination="getListNew" @selection-change="handleSelectionChange" :loading="loading"
                 :tableSearch="true" @columnSearch="handleQuery" @resetList="resetQuery">
       <template #operations="{ selections }">
         <el-row :gutter="10" class="mb8">
@@ -11,34 +11,35 @@
               size="mini"
               @click="handleAdd"
               v-hasPermi="['business:library:add']"
-            >{{ $t('common.add') }}</el-button>
+            >{{ $t('common.add') }}
+            </el-button>
           </el-col>
-<!--          <el-col :span="1.5">-->
-<!--            <el-button-->
-<!--              type="warning"-->
-<!--              plain-->
-<!--              icon="el-icon-upload2"-->
-<!--              size="mini"-->
-<!--              @click="handleExport"-->
-<!--              v-hasPermi="['business:library:export']"-->
-<!--            >{{ $t('common.export') }}</el-button>-->
-<!--          </el-col>-->
+          <!--          <el-col :span="1.5">-->
+          <!--            <el-button-->
+          <!--              type="warning"-->
+          <!--              plain-->
+          <!--              icon="el-icon-upload2"-->
+          <!--              size="mini"-->
+          <!--              @click="handleExport"-->
+          <!--              v-hasPermi="['business:library:export']"-->
+          <!--            >{{ $t('common.export') }}</el-button>-->
+          <!--          </el-col>-->
           <el-col :span="1.5">
-<!--            <el-button
-              type="warning"
-              plain
-              icon="el-icon-import"
-              size="mini"
-              @click="handleImport"
-              v-hasPermi="['business:library:import']"
-            >{{ $t('common.import') }}</el-button>-->
+            <!--            <el-button
+                          type="warning"
+                          plain
+                          icon="el-icon-import"
+                          size="mini"
+                          @click="handleImport"
+                          v-hasPermi="['business:library:import']"
+                        >{{ $t('common.import') }}</el-button>-->
           </el-col>
 
         </el-row>
       </template>
 
       <template #default="{ list }">
-        <el-table-column label="No" align="center" :min-width="50"  fixed="left" >
+        <el-table-column label="No" align="center" :min-width="50" fixed="left">
           <template slot-scope="scope">{{ scope.$index + 1 }}</template>
         </el-table-column>
         <Column :label="$t('elevatorModel.areaName')" :searchDict="areaOps" :showSearch="true" :labelProp="localLabel" :searchParams="queryParams"
@@ -47,10 +48,10 @@
             <span>{{ changeLanguage(row.areaId) }}</span>
           </template>
         </Column>
-        <Column  :label="$t('elevatorModel.elevatorTypeName')" align="center" prop="elevatorType" :min-width="200" :searchDict="dict.type.elevator_type"
-                 :selectMore="true" :searchParams="queryParams" :showSearch="true" searchType="select">
+        <Column :label="$t('elevatorModel.elevatorTypeName')" align="center" prop="elevatorType" :min-width="200" :searchDict="dict.type.elevator_type"
+                :selectMore="true" :searchParams="queryParams" :showSearch="true" searchType="select">
           <template #default="{ row }">
-            <span>{{ formatDict(row.elevatorType,'elevator_type') }}</span>
+            <span>{{ formatDict(row.elevatorType, 'elevator_type') }}</span>
           </template>
         </Column>
         <Column :label="$t('elevatorModel.elevatorModel')" align="center" prop="elevatorModel" :min-width="150" :searchParams="queryParams" :showSearch="true" searchType="input"/>
@@ -75,28 +76,31 @@
                          :close="getList" :defaultParams="{id:row.id}" buttonType="text"/>
 
             <el-button size="mini" type="text" icon="el-icon-upload2"
-                        @click="handleExportCS(row)"
-                       >{{ $t('common.export') }}</el-button>
+                       @click="handleExportCS(row)"
+            >{{ $t('common.export') }}
+            </el-button>
             <el-button size="mini" type="text"
                        icon="el-icon-edit" @click="handleUpdate(row)"
-                       v-hasPermi="['business:elevator:edit']">{{ $t('common.edit') }}</el-button>
+                       v-hasPermi="['business:elevator:edit']">{{ $t('common.edit') }}
+            </el-button>
             <el-button size="mini" type="text"
                        icon="el-icon-s-unfold" @click="handleParam(row)"
-                       v-hasPermi="['business:elevator:paramInfo']">{{ $t('elevatorModel.areaParam') }}</el-button>
+                       v-hasPermi="['business:elevator:paramInfo']">{{ $t('elevatorModel.areaParam') }}
+            </el-button>
 
-            <el-dropdown size="mini"  @command="(command) => handleCommand(command, row)">
+            <el-dropdown size="mini" @command="(command) => handleCommand(command, row)">
               <el-button icon="el-icon-d-arrow-right" size="mini" type="text">{{ $t('common.more') }}</el-button>
               <el-dropdown-menu slot="dropdown">
-                <el-dropdown-item  v-hasPermi="['business:elevator:getParamItemInfo']" command="handleSelect"
+                <el-dropdown-item v-hasPermi="['business:elevator:getParamItemInfo']" command="handleSelect"
                                   size="mini" icon="el-icon-s-data">{{ $t('elevatorModel.selectItem') }}
                 </el-dropdown-item>
 
-                <el-dropdown-item  v-hasPermi="['business:elevator:getStantInfo']" command="handleStandard"
-                                   size="mini" icon="el-icon-s-management">{{ $t('elevatorModel.paramStandard') }}
+                <el-dropdown-item v-hasPermi="['business:elevator:getStantInfo']" command="handleStandard"
+                                  size="mini" icon="el-icon-s-management">{{ $t('elevatorModel.paramStandard') }}
                 </el-dropdown-item>
 
-                <el-dropdown-item  v-hasPermi="['business:library:edit']" command="handleJGB"
-                                   size="mini" icon="el-icon-document">{{ $t('elevatorModel.priceLine') }}
+                <el-dropdown-item v-hasPermi="['business:library:edit']" command="handleJGB"
+                                  size="mini" icon="el-icon-document">{{ $t('elevatorModel.priceLine') }}
                 </el-dropdown-item>
 
                 <el-dropdown-item v-hasPermi="['business:library:remove']" command="handleDelete"
@@ -105,18 +109,18 @@
               </el-dropdown-menu>
             </el-dropdown>
 
-<!--            <el-button size="mini" type="text"-->
-<!--                       icon="el-icon-edit" @click="handleSelect(row)"-->
-<!--                       v-hasPermi="['business:elevator:getParamItemInfo']">{{ $t('elevatorModel.selectItem') }}</el-button>-->
-<!--            <el-button size="mini" type="text"-->
-<!--                       icon="el-icon-edit" @click="handleStandard(row)"-->
-<!--                       v-hasPermi="['business:elevator:getStantInfo']">{{ $t('elevatorModel.paramStandard') }}</el-button>-->
-<!--            <el-button size="mini" type="text"-->
-<!--                       icon="el-icon-edit" @click="handleJGB(row)"-->
-<!--                       v-hasPermi="['business:library:edit']">{{ $t('elevatorModel.priceLine') }}</el-button>-->
-<!--            <el-button size="mini" type="text"-->
-<!--                       icon="el-icon-delete" @click="handleDelete(row)"-->
-<!--                       v-hasPermi="['business:library:remove']">{{ $t('common.delete') }}</el-button>-->
+            <!--            <el-button size="mini" type="text"-->
+            <!--                       icon="el-icon-edit" @click="handleSelect(row)"-->
+            <!--                       v-hasPermi="['business:elevator:getParamItemInfo']">{{ $t('elevatorModel.selectItem') }}</el-button>-->
+            <!--            <el-button size="mini" type="text"-->
+            <!--                       icon="el-icon-edit" @click="handleStandard(row)"-->
+            <!--                       v-hasPermi="['business:elevator:getStantInfo']">{{ $t('elevatorModel.paramStandard') }}</el-button>-->
+            <!--            <el-button size="mini" type="text"-->
+            <!--                       icon="el-icon-edit" @click="handleJGB(row)"-->
+            <!--                       v-hasPermi="['business:library:edit']">{{ $t('elevatorModel.priceLine') }}</el-button>-->
+            <!--            <el-button size="mini" type="text"-->
+            <!--                       icon="el-icon-delete" @click="handleDelete(row)"-->
+            <!--                       v-hasPermi="['business:library:remove']">{{ $t('common.delete') }}</el-button>-->
 
           </template>
         </Column>
@@ -124,13 +128,13 @@
     </card-table>
 
     <!-- 添加或修改参数配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" top="5%" width="50%" append-to-body :close-on-click-modal="false">
+    <el-dialog :title="title" :visible.sync="open" top="5%" width="50%" :close-on-click-modal="false">
       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
         <el-row>
           <el-col :span="12">
             <el-form-item :label="$t('elevatorModel.areaName')" prop="areaId">
               <treeselect v-model="form.areaId" :flat="true" :options="areaTree" :noResultsText="$t('common.noResultsText')"
-                          :placeholder="$t('user.placeholder_area')" :show-count="true"
+                          :placeholder="$t('user.placeholder_area')" :show-count="true" :append-to-body="true" :zIndex="999999"
                           @select=""/>
             </el-form-item>
           </el-col>
@@ -165,37 +169,38 @@
       </div>
     </el-dialog>
     <!--参数选配-->
-    <el-dialog :title="title" :visible.sync="openXP"  top="5%" width="70%" append-to-body :close-on-click-modal="false">
+    <el-dialog :title="title" :visible.sync="openXP" top="5%" width="70%" append-to-body :close-on-click-modal="false">
       <el-form ref="formXP" :model="formXP" label-width="120px" v-if="openXP">
         <el-row>
           <el-col :span="8">
             <Select :label="$t('elevatorModel.areaName')" prop="areaId" :labelProp="localLabel" valueProp="areaId" :data="areaOps" :placeholder="$t('common.pleaseSelect')" disabled/>
-<!--            <el-form-item :label="$t('elevatorModel.areaName')" prop="areaId">-->
-<!--            </el-form-item>-->
+            <!--            <el-form-item :label="$t('elevatorModel.areaName')" prop="areaId">-->
+            <!--            </el-form-item>-->
           </el-col>
           <el-col :span="8">
-            <Select :showTip="true"  :label="$t('elevatorModel.elevatorTypeName')" prop="elevatorType" :data="dict.type.elevator_type" :placeholder="$t('common.pleaseSelect')" disabled/>
+            <Select :showTip="true" :label="$t('elevatorModel.elevatorTypeName')" prop="elevatorType" :data="dict.type.elevator_type" :placeholder="$t('common.pleaseSelect')" disabled/>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="$t('elevatorModel.elevatorModel')" prop="elevatorModel">
-              <el-input v-model="formXP.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled />
+              <el-input v-model="formXP.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled/>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row><el-col :span="24" style="padding-left: 80px">
-          <h3>{{ $t('elevatorModel.paramSelect') + ':'}}</h3>
-          <el-select v-model="transferQuery" placeholder="请选择" @change="changeQuery" allow-create filterable style="margin-bottom: 5px">
-            <el-option
-              v-for="item in transferQueryOpt"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value">
-            </el-option>
-          </el-select>
-          <el-transfer class="paraSelect" ref="paraSelect" v-model="paraSelectList"
-                       :data="paraLibraryListOpt"
-                       :titles="[$t('elevatorModel.allParam'), $t('elevatorModel.isSelect')]"
-                       :filterable="true">
+        <el-row>
+          <el-col :span="24" style="padding-left: 80px">
+            <h3>{{ $t('elevatorModel.paramSelect') + ':' }}</h3>
+            <el-select v-model="transferQuery" placeholder="请选择" @change="changeQuery" allow-create filterable style="margin-bottom: 5px">
+              <el-option
+                v-for="item in transferQueryOpt"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+            <el-transfer class="paraSelect" ref="paraSelect" v-model="paraSelectList"
+                         :data="paraLibraryListOpt"
+                         :titles="[$t('elevatorModel.allParam'), $t('elevatorModel.isSelect')]"
+                         :filterable="true">
                         <span slot-scope="{ option }">
                                 <el-tooltip
                                   class="item"
@@ -205,8 +210,8 @@
                                   <span>{{ option.label }}</span>
                                 </el-tooltip>
                         </span>
-          </el-transfer>
-        </el-col>
+            </el-transfer>
+          </el-col>
         </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -228,7 +233,7 @@
           </el-col>
           <el-col :span="8">
             <el-form-item :label="$t('elevatorModel.elevatorModel')" prop="elevatorModel">
-              <el-input v-model="formSelectOpt.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled />
+              <el-input v-model="formSelectOpt.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -244,7 +249,7 @@
           <el-tabs type="border-card" v-else style="box-shadow: unset">
             <el-tab-pane v-for="item in formSelectOpt.tabsList" :label="getParaLabel(item.paraCategory)" style="height: 440px;overflow: auto">
               <el-col :span="12" style="padding-left: 80px" v-for="para in item.paraSelect">
-                <h3>{{ para[localParaLabel]}}</h3>
+                <h3>{{ para[localParaLabel] }}</h3>
                 <el-transfer v-model="para.paraAreaSelectList"
                              :data="para.paraSelectListOpt"
                              :titles="[$t('elevatorModel.allParam'), $t('elevatorModel.isSelect')]"
@@ -285,7 +290,7 @@
           </el-col>
           <el-col :span="8">
             <el-form-item :label="$t('elevatorModel.elevatorModel')" prop="elevatorModel">
-              <el-input v-model="formStand.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled />
+              <el-input v-model="formStand.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -298,19 +303,19 @@
           <el-tabs type="border-card" v-else style="box-shadow: unset">
             <el-tab-pane v-for="item in formStand.tabsList" :label="getParaLabel(item.paraCategory)" style="height: 440px;overflow: auto">
               <el-col :span="8" style="" v-for="para in item.paraSelect">
-<!--                <h3>{{ para[localParaLabel]}}</h3>-->
-                <el-form-item  :label="para.inputType == '05' ? ' ':para[localParaLabel]"  label-width="150px" class="stand-input">
-<!--                根据类型,普通输入00 / 数字输入01 /下拉框02 /小数下拉框03 /04可输入下拉框 -->
+                <!--                <h3>{{ para[localParaLabel]}}</h3>-->
+                <el-form-item :label="para.inputType == '05' ? ' ':para[localParaLabel]" label-width="150px" class="stand-input">
+                  <!--                根据类型,普通输入00 / 数字输入01 /下拉框02 /小数下拉框03 /04可输入下拉框 -->
 
                   <el-input v-if="para.inputType == '00'" :label="para[localParaLabel]" clearable
                             v-model.trim="para.paraDefaultValue" :placeholder="$t('common.pleaseInput')" @change="changeEditFlag(para)"/>
 
                   <el-input-number v-if="para.inputType == '01'" v-model="para.paraDefaultValue" :placeholder="$t('common.pleaseInput')" clearable
-                                    style="text-align: left"
+                                   style="text-align: left"
                                    :min="0" :max="99999" :precision="0" :controls="false" @change="changeEditFlag(para)"/>
 
                   <el-select v-if="para.inputType == '02'" v-model="para.paraDefaultValue" :placeholder="$t('common.pleaseSelect')"
-                             @change="value=>setSelectId(value,para)" clearable >
+                             @change="value=>setSelectId(value,para)" clearable>
                     <el-option
                       v-for="item in para.selectItemList"
                       :key="item.value"
@@ -350,7 +355,6 @@
         </el-row>
 
 
-
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button icon="el-icon-circle-check" type="primary" @click="submitStandForm" :disabled="formStand.tabsList && formStand.tabsList.length==0">{{ $t('common.confirm') }}</el-button>
@@ -370,7 +374,7 @@
           </el-col>
           <el-col :span="8">
             <el-form-item :label="$t('elevatorModel.elevatorModel')" prop="elevatorModel">
-              <el-input v-model="formJGB.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled />
+              <el-input v-model="formJGB.elevatorModel" :placeholder="$t('common.pleaseInput')" disabled/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -384,7 +388,7 @@
         <el-row>
           <el-tabs type="border-card">
             <el-tab-pane :label=" $t('elevatorModel.JJManage')" style="height: 540px;overflow: auto">
-              <el-col :span="12" style="padding-left: 0px;margin-bottom: 10px" >
+              <el-col :span="12" style="padding-left: 0px;margin-bottom: 10px">
                 <h3>基础价格</h3>
                 <el-button @click="cancel">{{ }}新增行</el-button>
                 <el-button @click="cancel">{{ }}删除行</el-button>
@@ -401,19 +405,19 @@
                 max-height="520px"
                 :border="true"
                 :header-cell-style="{'background-color':'#F4F6F8','border-right':'1px solid #dfdcdc','color':'#92A2B5'}">
-                <el-table-column type="selection" width="55" align="center" />
+                <el-table-column type="selection" width="55" align="center"/>
                 <el-table-column prop="ratedLoadCapacity" label="额定载重(kg)" width="200px">
                   <template slot-scope="scope">
                     <el-input-number v-model="scope.row.ratedLoadCapacity" style="width: 92%;"
                                      :disabled="disabled" :min="0" :max="99999"
-                                     :precision="2" class="custom-number" />
+                                     :precision="2" class="custom-number"/>
                   </template>
                 </el-table-column>
                 <el-table-column prop="ratedSpeed" label="额定速度(m/s)" width="200px">
                   <template slot-scope="scope">
                     <el-input-number v-model="scope.row.ratedSpeed" style="width: 92%;"
                                      :disabled="disabled" :min="0" :max="99999"
-                                     :precision="2" class="custom-number" />
+                                     :precision="2" class="custom-number"/>
                   </template>
                 </el-table-column>
                 <InputNumberColumn prop="standardDoorWidth" label="开门宽"/>
@@ -426,7 +430,7 @@
               </el-table>
             </el-tab-pane>
             <el-tab-pane :label=" $t('elevatorModel.XPManage')" style="height: 540px;overflow: auto">
-              <el-col :span="12" style="padding-left: 80px" >
+              <el-col :span="12" style="padding-left: 80px">
                 <h3>选配项目</h3>
                 <el-table
                   ref="table"
@@ -439,7 +443,7 @@
                   max-height="520px"
                   :border="true"
                   :header-cell-style="{'background-color':'#F4F6F8','border-right':'1px solid #dfdcdc','color':'#92A2B5'}">
-                  <el-table-column type="selection" width="55" align="center" />
+                  <el-table-column type="selection" width="55" align="center"/>
                   <el-table-column prop="contactName" :label="$t('contact.name')" width="200px">
                     <template slot-scope="scope">
                       <el-input v-model.trim="scope.row.contactName" :disabled="type == 'view'"
@@ -468,12 +472,12 @@
 
 
 <script>
-import { listModel, getModel, delModel, addModel, updateModel, changeEleStatus,getArea,listModelNew,getModelParam,getModelSelecItem,getModelStandItem,getModelJgbInfo,delModelCheck } from "@/api/business/crm/elevatorModel.js";
-import { updateModelParam } from "@/api/business/crm/areaPara.js";
-import { updateModelSelect } from "@/api/business/crm/areaSelectItem.js";
-import { updateModelStand } from "@/api/business/crm/standard.js";
+import {listModel, getModel, delModel, addModel, updateModel, changeEleStatus, getArea, listModelNew, getModelParam, getModelSelecItem, getModelStandItem, getModelJgbInfo, delModelCheck} from "@/api/business/crm/elevatorModel.js";
+import {updateModelParam} from "@/api/business/crm/areaPara.js";
+import {updateModelSelect} from "@/api/business/crm/areaSelectItem.js";
+import {updateModelStand} from "@/api/business/crm/standard.js";
 
-import { listLibrary } from "@/api/business/crm/paralibrary/library.js";
+import {listLibrary} from "@/api/business/crm/paralibrary/library.js";
 
 import ImportModal from "../../../components/ImportModal/index";
 import Treeselect from "@riophae/vue-treeselect";
@@ -482,11 +486,12 @@ import {getCountryByAreaId} from "@/api/system/user";
 import {getAreaTree} from "@/api/common/common";
 import InputColumn from "../../../components/element/table/InputColumn";
 import InputNumberColumn from "../../../components/element/table/InputNumberColumn";
-import { downloadTemplate } from '@/api/excel'
+import {downloadTemplate} from '@/api/excel'
+
 export default {
   name: "ElevatorModel",
-  components:{InputNumberColumn, InputColumn, Treeselect, ImportModal},
-  dicts: ['input_type','para_category','elevator_type','status_switch'],
+  components: {InputNumberColumn, InputColumn, Treeselect, ImportModal},
+  dicts: ['input_type', 'para_category', 'elevator_type', 'status_switch'],
   data() {
     return {
       // 遮罩层
@@ -518,7 +523,7 @@ export default {
       },
       // 表单参数
       form: {
-        areaId:null,
+        areaId: null,
         areaName: null,
         elevatorType: null,
         elevatorModel: null,
@@ -526,58 +531,56 @@ export default {
         status: null,
       },
       // 表单校验
-      rules:{
-        areaId:[
-          {required:true, message: this.$t('common.pleaseSelect')+this.$t('elevatorModel.areaName'), trigger:'blur'}
+      rules: {
+        areaId: [
+          {required: true, message: this.$t('common.pleaseSelect') + this.$t('elevatorModel.areaName'), trigger: 'blur'}
         ],
-        elevatorType:[
-          {required:true, message: this.$t('common.pleaseSelect')+this.$t('elevatorModel.elevatorTypeName'), trigger:'blur'}
+        elevatorType: [
+          {required: true, message: this.$t('common.pleaseSelect') + this.$t('elevatorModel.elevatorTypeName'), trigger: 'blur'}
         ],
-        elevatorModel:[
-          {required:true, message: this.$t('common.pleaseInput')+this.$t('elevatorModel.elevatorModel'), trigger:'blur'}
+        elevatorModel: [
+          {required: true, message: this.$t('common.pleaseInput') + this.$t('elevatorModel.elevatorModel'), trigger: 'blur'}
         ],
-        status:[
-          {required:true, message: this.$t('common.pleaseSelect')+this.$t('elevatorModel.status'), trigger:'blur'}
+        status: [
+          {required: true, message: this.$t('common.pleaseSelect') + this.$t('elevatorModel.status'), trigger: 'blur'}
         ],
-        remark:[
-          {required:true, message: this.$t('common.pleaseInput')+this.$t('elevatorModel.remark'), trigger:'blur'}
+        remark: [
+          {required: true, message: this.$t('common.pleaseInput') + this.$t('elevatorModel.remark'), trigger: 'blur'}
         ],
       },
-      selections:[],
+      selections: [],
       // 地区下拉
       areaOps: [],
       // 地区树
       areaTree: [],
-      localLabel:"",
-      localParaLabel:'',
-      localSelectLabel:"",
+      localLabel: "",
+      localParaLabel: '',
+      localSelectLabel: "",
       //参数选配
-      openXP:false,
+      openXP: false,
       //参数下拉选项
-      openSelectOpt:false,
-      openStand:false,
-      openJGB:false,
+      openSelectOpt: false,
+      openStand: false,
+      openJGB: false,
       //穿梭框选择集合
-      paraLibraryList:[],
+      paraLibraryList: [],
       //穿梭框选中集合
-      paraAreaSelectList:[],
-      paraSelectListOpt:[],
-      paraLibraryListOpt:[],
-      formXP:{},
-      formSelectOpt:{},
-      formStand:{},
-      formJGB:{},
-      tabsList:[{
-
-      }],
-      paraSelectList:[],
-      transferQuery:"",
-      transferQueryOpt:[],
-      JJData:[],
-      JJLoading:false,
-      selectionsJGB:[],
-      localDictLabel:"",
-      exportLoading:true
+      paraAreaSelectList: [],
+      paraSelectListOpt: [],
+      paraLibraryListOpt: [],
+      formXP: {},
+      formSelectOpt: {},
+      formStand: {},
+      formJGB: {},
+      tabsList: [{}],
+      paraSelectList: [],
+      transferQuery: "",
+      transferQueryOpt: [],
+      JJData: [],
+      JJLoading: false,
+      selectionsJGB: [],
+      localDictLabel: "",
+      exportLoading: true
     };
   },
   created() {
@@ -591,9 +594,9 @@ export default {
     /** 导出按钮操作 */
     handleExportCS(row) {
       this.loading = true
-      const fileName = this.changeLanguage(row.areaId)+"_"+row.elevatorModel+'_梯型参数_' + this.parseTime(new Date(), '{y}{m}{d}') + '.xlsx'
-      downloadTemplate({ tableType: 7, elevatorModelId: row.id, withData: true, downloadFileName: fileName }).then(response => {
-        if(response){
+      const fileName = this.changeLanguage(row.areaId) + "_" + row.elevatorModel + '_梯型参数_' + this.parseTime(new Date(), '{y}{m}{d}') + '.xlsx'
+      downloadTemplate({tableType: 7, elevatorModelId: row.id, withData: true, downloadFileName: fileName}).then(response => {
+        if (response) {
           this.$modal.msgError('导出失败');
         }
       }).finally(() => this.loading = false)
@@ -621,15 +624,15 @@ export default {
       }
     },
     //设置输入类型下拉框
-    setInputType(){
+    setInputType() {
       let dicts = JSON.parse(JSON.stringify(this.dict.type.para_category))
-      dicts.some(item=>{
+      dicts.some(item => {
         item.value = item.label
       })
-      this.transferQueryOpt  = dicts
+      this.transferQueryOpt = dicts
     },
-    changeQuery(val){
-      if(!val||val == ""){
+    changeQuery(val) {
+      if (!val || val == "") {
         val = this.transferQueryOpt[0].value
       }
       this.$refs.paraSelect.$refs.leftPanel.query = val;
@@ -659,7 +662,7 @@ export default {
       this.openXP = false;
       this.openSelectOpt = false;
       this.openStand = false;
-      this.openJGB= false;
+      this.openJGB = false;
       this.reset();
       this.resetXP()
       this.resetSelectOpt()
@@ -685,20 +688,20 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.queryParams.pageNum= 1;
-      this.queryParams.pageSize= 10;
-      this.queryParams.areaName= null;
-      this.queryParams.elevatorType= null;
-      this.queryParams.remark= null;
-      this.queryParams.elevatorModel= null;
-      this.queryParams.status= null;
-      this.queryParams.areaId= [];
+      this.queryParams.pageNum = 1;
+      this.queryParams.pageSize = 10;
+      this.queryParams.areaName = null;
+      this.queryParams.elevatorType = null;
+      this.queryParams.remark = null;
+      this.queryParams.elevatorModel = null;
+      this.queryParams.status = null;
+      this.queryParams.areaId = [];
       this.getList();
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
+      this.single = selection.length !== 1
       this.multiple = !selection.length
       this.selections = selection
     },
@@ -741,14 +744,15 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const ids = row.id || this.ids;
-      this.$modal.confirm(this.$t('common.isDelete')).then(function() {
+      this.$modal.confirm(this.$t('common.isDelete')).then(function () {
         // return delModel(ids);
         debugger
         return delModelCheck([row]);
       }).then(() => {
         this.getList();
         this.$modal.msgSuccess(this.$t('common.deleteSuccess'));
-      }).catch(() => {});
+      }).catch(() => {
+      });
     },
     /** 导出按钮操作 */
     handleExport() {
@@ -758,26 +762,27 @@ export default {
       }, `library_${new Date().getTime()}.xlsx`)
     },
     /** 导入按钮操作 */
-    handleImport() {  },
+    handleImport() {
+    },
 
     // 字典值format
-    formatDict(value,dictType){
+    formatDict(value, dictType) {
       let labelStr = '';
-      for(let i =0;i< this.dict.type[dictType].length;i++){
+      for (let i = 0; i < this.dict.type[dictType].length; i++) {
         let item = this.dict.type[dictType][i]
-        if(item.value == value){
+        if (item.value == value) {
           labelStr = item.label;
           break;
         }
       }
-      return  labelStr;
+      return labelStr;
     },
     // 参数状态修改
     handleStatusChange(row) {
       let text = row.status === "0" ? this.$t('common.enableSuccess') : this.$t('common.deactivatSuccess');
-      let conformMsg =  row.status === "0" ? this.$t('common.enableConfirmMsg') : this.$t('common.deactivatConfirmMsg');
-      this.$modal.confirm(conformMsg + this.$t('elevatorModel.elevatorModel') +'=' + row.elevatorModel).then(function () {
-        return changeEleStatus(row.id, row.status,row.updateTime);
+      let conformMsg = row.status === "0" ? this.$t('common.enableConfirmMsg') : this.$t('common.deactivatConfirmMsg');
+      this.$modal.confirm(conformMsg + this.$t('elevatorModel.elevatorModel') + '=' + row.elevatorModel).then(function () {
+        return changeEleStatus(row.id, row.status, row.updateTime);
       }).then(() => {
         this.$modal.msgSuccess(text);
         this.getList();
@@ -802,35 +807,39 @@ export default {
       this.areaOps = response.data;
     },
     //设置本地语音label
-    setLabel(){
+    setLabel() {
       let currentLocale = window.VueI18n.locale;
       switch (currentLocale) {
-        case "chinese": this.localLabel ="areaName"
-          this.localParaLabel ="paraName"
-          this.localSelectLabel ="label"
-          this.localDictLabel ="dict_label"
+        case "chinese":
+          this.localLabel = "areaName"
+          this.localParaLabel = "paraName"
+          this.localSelectLabel = "label"
+          this.localDictLabel = "dict_label"
           break
-        case "english": this.localLabel ="areaNameUS"
-          this.localParaLabel ="paraNameUS"
-          this.localSelectLabel ="labelUS"
-          this.localDictLabel ="dict_labelUS"
+        case "english":
+          this.localLabel = "areaNameUS"
+          this.localParaLabel = "paraNameUS"
+          this.localSelectLabel = "labelUS"
+          this.localDictLabel = "dict_labelUS"
           break
-        case "russia": this.localLabel ="areaNameRU"
-          this.localParaLabel ="paraNameRU"
-          this.localSelectLabel ="labelRU"
-          this.localDictLabel ="dict_labelRU"
+        case "russia":
+          this.localLabel = "areaNameRU"
+          this.localParaLabel = "paraNameRU"
+          this.localSelectLabel = "labelRU"
+          this.localDictLabel = "dict_labelRU"
           break
-        case "spanish": this.localLabel ="areaNameES"
-          this.localParaLabel ="paraNameES"
-          this.localSelectLabel ="labelES"
-          this.localDictLabel ="dict_labelES"
+        case "spanish":
+          this.localLabel = "areaNameES"
+          this.localParaLabel = "paraNameES"
+          this.localSelectLabel = "labelES"
+          this.localDictLabel = "dict_labelES"
           break
       }
     },
     //改变语言
-    changeLanguage(id){
-      let res = this.selectLabelList(this.areaOps,id,this.localLabel,"areaId");
-      return res?res:"-"
+    changeLanguage(id) {
+      let res = this.selectLabelList(this.areaOps, id, this.localLabel, "areaId");
+      return res ? res : "-"
     },
     //跳转
     jump() {
@@ -843,26 +852,26 @@ export default {
     async handleParam(row) {
       this.setInputType();
       //处理数据让他成为穿梭框数据
-      this.paraLibraryListOpt = this.changeTransfer(this.paraLibraryList.filter(it=> it.elevatorType === row.elevatorType),this.localParaLabel,"id")
+      this.paraLibraryListOpt = this.changeTransfer(this.paraLibraryList.filter(it => it.elevatorType === row.elevatorType), this.localParaLabel, "id")
 
       this.resetXP();
       const id = row.id || this.ids
       const response = await getModelParam(id);
-      if(response.data){
+      if (response.data) {
         //处理数据,赋值为穿梭框选中集合
         this.formXP = response.data;
-        if(this.formXP.paraSelect){
+        if (this.formXP.paraSelect) {
           //已经保存过了
-          this.paraSelectList = this.formXP.paraSelect.map(it=>it.paramId)
+          this.paraSelectList = this.formXP.paraSelect.map(it => it.paramId)
         }
       }
       this.openXP = true;
       this.title = this.$t('elevatorModel.XPParameter');
 
-      setTimeout(()=>{
+      setTimeout(() => {
         this.transferQuery = this.transferQueryOpt[0].value;
-        this.$refs.paraSelect.$refs.leftPanel.query =  this.transferQuery;
-      },200)
+        this.$refs.paraSelect.$refs.leftPanel.query = this.transferQuery;
+      }, 200)
 
     },
     //参数选项
@@ -872,17 +881,17 @@ export default {
       const response = await getModelSelecItem(id);
       //处理数据,赋值为穿梭框选中集合
       this.formSelectOpt = response.data;
-      if(!this.formSelectOpt.tabsList){
+      if (!this.formSelectOpt.tabsList) {
         //设定不能保存
       }
       this.openSelectOpt = true;
       this.title = this.$t('elevatorModel.optSet');
     },
     //选配参数一键全选
-    selectAll(){
-      this.formSelectOpt.tabsList.some(it=>{
-        it.paraSelect.some(sel=>{
-          sel.paraAreaSelectList = sel.paraSelectListOpt.map(item=>item.key)
+    selectAll() {
+      this.formSelectOpt.tabsList.some(it => {
+        it.paraSelect.some(sel => {
+          sel.paraAreaSelectList = sel.paraSelectListOpt.map(item => item.key)
           sel.operationFlag = 2
         })
       })
@@ -894,7 +903,7 @@ export default {
         elevatorModel: null,
         remark: null,
         status: null,
-        paraSelect:[],
+        paraSelect: [],
       }
       this.paraSelectList = []
     },
@@ -905,7 +914,7 @@ export default {
         elevatorModel: null,
         remark: null,
         status: null,
-        TabsList:[],
+        TabsList: [],
       }
     },
     resetStand() {
@@ -915,15 +924,15 @@ export default {
         elevatorModel: null,
         remark: null,
         status: null,
-        tabsList:[],
+        tabsList: [],
       }
     },
     //获取全部的参数列表
     getParamLibraryList() {
       let params;
       params = {
-        pageNum:0,
-        pageSize:0,
+        pageNum: 0,
+        pageSize: 0,
         status: 0,
       };
       listLibrary(params).then(response => {
@@ -946,15 +955,15 @@ export default {
       //只有更新
       //新增之前处理数据
       this.formXP.paraSelect = [];
-      this.paraSelectList.some(item=>{
-        let paraLibrary = this.paraLibraryList.filter(library=> library.id == item )
+      this.paraSelectList.some(item => {
+        let paraLibrary = this.paraLibraryList.filter(library => library.id == item)
         let paraSelect = {
-          paraId:item,
-          paramId:item,
-          paraCode:paraLibrary[0].paraCode,
-          elevatorModelId:this.formXP.id,
-          paraName:paraLibrary[0].paraName,
-          sort:paraLibrary[0].sortNumber
+          paraId: item,
+          paramId: item,
+          paraCode: paraLibrary[0].paraCode,
+          elevatorModelId: this.formXP.id,
+          paraName: paraLibrary[0].paraName,
+          sort: paraLibrary[0].sortNumber
         };
         this.formXP.paraSelect.push(paraSelect)
       });
@@ -969,18 +978,18 @@ export default {
       });
     },
     /**获取国际化*/
-    getParaLabel(value){
+    getParaLabel(value) {
       let res = "-";
       let dicts = this.dict.type.para_category;
-      dicts.some(it=>{
-        if(it.value == value){
+      dicts.some(it => {
+        if (it.value == value) {
           res = it.label
         }
       })
       return res
     },
     /**改变编辑状态*/
-    changeEditFlag(row){
+    changeEditFlag(row) {
       //把状态变为已改变
       row.operationFlag = 2
     },
@@ -1019,13 +1028,13 @@ export default {
       });
     },
     /**改变编辑标志并且设置修改的id*/
-    setSelectId(value,row){
+    setSelectId(value, row) {
       //改变编辑标志
       row.operationFlag = 2
       //设置Id值
       let arrs = row.selectItemList
-      arrs.some(item=>{
-        if(value == item.value){
+      arrs.some(item => {
+        if (value == item.value) {
           row.paraDefaultId = item.paraSelectItemId
         }
       });
@@ -1033,7 +1042,7 @@ export default {
 
     /** 行link操作 */
     handleJGB(row) {
-      this.$router.push({path: "/para/priceForm", query: { id: row.id }});
+      this.$router.push({path: "/para/priceForm", query: {id: row.id}});
     },
     /**打开价格表编辑页面*/
     async handleJGB1(row) {
@@ -1051,14 +1060,14 @@ export default {
       this.selectionsJGB = selection
     },
     resetJGB() {
-      this.formJGB= {
+      this.formJGB = {
         areaId: null,
         elevatorType: null,
         elevatorModel: null,
         remark: null,
         status: null,
-        baseData:[],
-        xpData:[]
+        baseData: [],
+        xpData: []
       }
     },
   }

+ 35 - 5
ruoyi-ui-vue2/src/views/train/trainTarget/index.vue

@@ -48,6 +48,12 @@
                 :searchParams="queryParams"
                 prop="trainCompleteFlag" searchType="select" select-more
                 select-prop="trainCompleteFlags" show-search>
+          <template #default="{ row }">
+            <ColorDictTag :bgc="statusColorMap[row.trainCompleteFlag].bgc"
+                          :label="convertStatus(row.trainCompleteFlag)"
+                          :label-color="statusColorMap[row.trainCompleteFlag].color"
+            />
+          </template>
         </Column>
 
 
@@ -98,13 +104,32 @@ import { getCurrency } from '@/api/user/currency'
 import CardTable from '@/components/element/table/CardTable.vue'
 import Column from '@/components/element/table/Column.vue'
 import { participantTrainPage } from '@/api/train/train'
-
+import ColorDictTag from "@/views/crmManagement/lead/ColorDictTag/index.vue";
+const statusColorMap = {
+  '0': {
+    color: '#FFC500',
+    bgc: 'rgba(255,200,12,0.12)'
+  },
+  '1': {
+    color: '#24CA5D',
+    bgc: 'rgba(24,199,84,0.12)'
+  },
+  '2': {
+    color: '#8B71FD',
+    bgc: 'rgba(139,113,253,0.12)'
+  },
+  '3': {
+    color: '#D71943',
+    bgc: '#FAEDED'
+  },
+}
 export default {
   name: 'Currency',
-  components: { Column, CardTable },
+  components: {ColorDictTag, Column, CardTable },
   dicts: ['training_category', 'train_whether_to_assess', 'train_status', 'train_exam_status','train_target_train_complete_flag'],
   data() {
     return {
+      statusColorMap: statusColorMap,
       pageLoading: false,
       // 遮罩层
       loading: false,
@@ -143,8 +168,9 @@ export default {
     this.getList()
   },
   methods: {
-    belongTimeRange(row){
-      return row.trainStatus === '01'
+    convertStatus(status) {
+      if (!status) return '-'
+      return this.dict.type.train_target_train_complete_flag.filter(item => item.value === status)[0].label
     },
     /** 查询币种汇率列表 */
     async getList() {
@@ -217,7 +243,11 @@ export default {
       if(row.trainStatus === '02'){
         return this.$modal.msgWarning(this.$t("trainTarget.trainIsEnd"))
       }
-      this.$tab.openPage('参与培训', `/participate-train/${row.id}`)
+      console.log('row::',row)
+      let query = {
+        data:row
+      }
+      this.$tab.openPage('参与培训', `/participate-train/${row.id}`,query)
     },
 
     // 参与考核

+ 47 - 11
ruoyi-ui-vue2/src/views/train/trainTarget/participateTrain/index.vue

@@ -1,7 +1,14 @@
 <!-- 参与培训 -->
 <template>
   <div class="app-container">
-
+    <div class="top" style="margin-bottom: 40px">
+      <div class="account-title">{{'' }}</div>
+      <div class="button-group">
+        <el-button @click="cancel" icon="el-icon-remove-outline">
+          {{ $t('common.cancel') }}
+        </el-button>
+      </div>
+    </div>
     <div class="title-bar">
       <span>Civil Engineering Drawing</span>
     </div>
@@ -17,10 +24,13 @@
       <!--</div>-->
 
       <el-button-group>
-        <el-button icon="el-icon-plus" type="primary" @click="handleCompleteTrain"
+        <el-button disabled v-show="row.trainCompleteFlag != 0 " type="primary"
+        >{{ $t('trainList.finished') }}
+        </el-button>
+        <el-button  icon="el-icon-plus" v-show="row.trainCompleteFlag == 0 " type="primary" @click="handleCompleteTrain"
         >{{ $t('trainTarget.completeTrain') }}
         </el-button>
-        <el-button icon="el-icon-plus" type="primary" @click="handleExam"
+        <el-button v-if="row.assessFlag == 1" icon="el-icon-plus" type="primary" @click="handleExam"
         >{{ $t('trainTarget.participateExam') }}
         </el-button>
       </el-button-group>
@@ -38,7 +48,7 @@ import DocumentPreview from '@/components/DocumentPreview/index.vue'
 //引入VueOfficeExcel组件
 import VueOfficeExcel from '@vue-office/excel'
 import {getFileByTrainId} from '@/api/train/file'
-import {updateTarget} from "@/api/train/target";
+import {editTargetStatus, getTarget} from "@/api/train/target";
 //引入相关样式
 
 export default {
@@ -53,6 +63,7 @@ export default {
       trainId: null,
       trainFile: null,
       url: "",
+      row: {},
     }
   },
 
@@ -63,6 +74,8 @@ export default {
   },
 
   created() {
+    console.log("this.$route.query.data", this.$route.query.data)
+    this.row = this.$route.query.data
     this.trainId = this.$route.params && this.$route.params.trainId;
     // 获取数据
     this.getTrainInfo()
@@ -74,17 +87,17 @@ export default {
   methods: {
 
     async getTrainInfo() {
+      debugger
       try {
         const response = await getFileByTrainId(this.trainId).catch(e => {
           console.log('EEEE222:')
           console.log(e)
         })
-        console.log(response)
+        console.log("res=========>", response)
         this.trainFile = response.data
         this.url = response.data.file.filePath
         console.log('查询获取url:', this.url)
       } catch (e) {
-        console.log('EEEE:')
         console.log(e)
         // this.url = this.url12
       }
@@ -99,11 +112,15 @@ export default {
     // 完成培训
     handleCompleteTrain() {
       let query = {
-        id: this.trainId,
+        id: this.$route.query.data.ttTargetId,
+        updateTime: this.trainFile.updateTime,
       }
       // 更新培训状态
-      updateTarget(query).then(response => {
-        // this.$message.success('培训完成')
+      editTargetStatus(query).then(response => {
+        this.$message.success('培训完成')
+        getTarget(query.id).then(response => {
+          this.row.trainCompleteFlag = response.data.trainCompleteFlag
+        })
       })
     },
     // 参加考试
@@ -114,7 +131,10 @@ export default {
         }
       }
       this.$tab.openPage(this.$t('trainTarget.participateExam'), "/train/trainTarget/detail/testPaper", query)
-    }
+    },
+    cancel() {
+      this.$tab.closeOpenPage("/train/trainTarget/")
+    },
   }
 }
 
@@ -134,6 +154,18 @@ export default {
     padding-bottom: 24px;
   }
 
+  .account-title {
+    font-family: Arial, Arial;
+    font-weight: bold;
+    font-size: 18px;
+    line-height: 21px;
+  }
+
+  .button-group {
+    display: flex;
+  }
+
+
   .participate-train-wrapper {
     background-color: #fff;
 
@@ -168,7 +200,11 @@ export default {
     }
   }
 }
-
+.top {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
 
 .frame-box {
   height: 40vh;

+ 17 - 6
ruoyi-ui-vue2/src/views/train/trainlist/detail/addTrain.vue

@@ -66,7 +66,7 @@
                 </Column>
                 <Column :label="$t('user.agent')" prop="agentName">
                   <template #default="{ row }">
-                    <span v-if="row.dept_id === 0">{{ $t('common.head') }}</span>
+                    <span v-if="row.deptId == 0">{{ $t('common.head') }}</span>
                     <span v-else>{{ row.agentName }}</span>
                   </template>
                 </Column>
@@ -92,7 +92,7 @@
                 </el-button>
               </el-form-item>
               <!--            附件列表-->
-              <card-table :data="fileList" style="width: 80%;margin: 0 40px 0 110px" :searchParams="fileQueryParams">
+              <card-table :modalData="fileList" style="width: 80%;margin: 0 40px 0 110px" :searchParams="fileQueryParams">
                 <el-table-column label="No" type="index"></el-table-column>
                 <el-table-column :label="$t('trainList.filename')" prop="fileName"></el-table-column>
                 <el-table-column v-show="openType !== 'view'" :label="$t('common.operate')" align="center">
@@ -153,7 +153,7 @@
                   {{ $t('trainList.fillInTheBlankQuestions') }}({{ fillInTheBlankQuestions }})
                 </div>
               </el-form-item>
-              <card-table :data="questionList" :search-params="questionParams" style="width: 80%;margin: 0 40px 0 110px">
+              <card-table :modal-data="questionList" :search-params="questionParams" style="width: 80%;margin: 0 40px 0 110px">
                 <el-table-column label="No" type="index"/>
                 <el-table-column :label="$t('trainList.questionContext')" align="left" prop="questionContext"
                                  :show-overflow-tooltip="true"/>
@@ -217,7 +217,7 @@
 <!--                        <Column :label="$t('user.agent')" prop="agentName"/>-->
         <Column :label="$t('user.agent')" prop="agentName">
           <template #default="{ row }">
-            <span v-if="row.deptId === 0">{{ $t('common.head') }}</span>
+            <span v-if="row.deptId == 0">{{ $t('common.head') }}</span>
             <span v-else>{{ row.agentName }}</span>
           </template>
         </Column>
@@ -334,6 +334,8 @@ import DictSelect from "@/views/audit/components/form/DictSelect.vue";
 import {getFile} from "@/api/train/file";
 import {questionPage} from "@/api/train/database";
 import DatePickerRange from "@/components/element/form/items/DatePickerRange.vue";
+import {SUPPORT_FILE_FORMAT} from '@/utils/fileFormart'
+
 
 export default {
   name: 'AddTrain',
@@ -1066,8 +1068,17 @@ export default {
     },
 // 文件选择提交
     submitFileForm() {
-      const fileSelectionList = this.$refs.Database.selectionList
-      this.fileList = JSON.parse(JSON.stringify(fileSelectionList))
+      // 对选择的文件格式做限制
+      let formatList = Array.from(SUPPORT_FILE_FORMAT).join("|")
+      const fileList = this.$refs.Database.selectionList.filter(item => {
+        const regexString  = `.*\\.(${formatList})$`;
+        const reg = new RegExp(regexString,'i')
+        return reg.test(item.fileName)
+      })
+      if (fileList.length <= 0) {
+        return this.$message.warning(this.$t("trainList.fileTypeError").toString());
+      }
+      this.fileList = JSON.parse(JSON.stringify(fileList))
       this.isAddTrainFile = false;
     },
 

+ 22 - 13
ruoyi-ui-vue2/src/views/train/trainlist/detail/trainDetail.vue

@@ -59,14 +59,13 @@
                     <span>{{ row.roleNames }}</span>
                   </template>
                 </Column>
-                <Column :label="$t('user.agent')" prop="agentName"/>
-                <!--                <el-table-column v-show="false" :label="$t('common.operate')" align="center">-->
-                <!--                  <template #default="{ row }">-->
-                <!--                    <el-button v-hasPermi="['train:list:delete']" icon="el-icon-delete" size="mini"-->
-                <!--                               type="text" @click="deleteTrainTarget(row)">{{ $t('common.delete') }}-->
-                <!--                    </el-button>-->
-                <!--                  </template>-->
-                <!--                </el-table-column>-->
+<!--                <Column :label="$t('user.agent')" prop="agentName"/>-->
+                <Column :label="$t('user.agent')" prop="agentName">
+                  <template #default="{ row }">
+                    <span v-if="row.deptId == 0">{{ $t('common.head') }}</span>
+                    <span v-else>{{ row.agentName }}</span>
+                  </template>
+                </Column>
               </card-table>>
 
               <el-row :gutter="20">
@@ -83,7 +82,7 @@
                 </el-button>
               </el-form-item>
               <!--            附件列表-->
-              <card-table :data="fileList" style="width: 80%;margin: 0 40px 0 110px" :searchParams="fileQueryParams">
+              <card-table :modal-data="fileList" style="width: 80%;margin: 0 40px 0 110px" :searchParams="fileQueryParams">
                 <el-table-column label="No" type="index"></el-table-column>
                 <el-table-column :label="$t('trainList.filename')" prop="fileName"></el-table-column>
                 <!--                <el-table-column v-show="false" :label="$t('common.operate')" align="center">-->
@@ -153,7 +152,7 @@
                 </div>
               </el-form-item>
 
-              <card-table :data="questionList" :search-params="questionParams" style="width: 80%;margin: 0 40px 0 110px">
+              <card-table :modal-data="questionList" :search-params="questionParams" style="width: 80%;margin: 0 40px 0 110px">
                 <el-table-column label="No" type="index"/>
                 <el-table-column :label="$t('trainList.questionContext')" align="left" prop="questionContext"
                                  :show-overflow-tooltip="true"/>
@@ -209,11 +208,16 @@
                 </el-statistic>
               </el-col>
             </el-row>
-            <card-table :data="trackList" :search-params="trainingTrackingParams" style="width: 80%;margin: 20px 40px 0 160px">
+            <card-table :modal-data="trackList" :search-params="trainingTrackingParams" style="width: 80%;margin: 20px 40px 0 160px">
               <el-table-column label="No" type="index"/>
               <Column :label="$t('trainList.participants')" prop="nickName" align="center"/>
               <Column :label="$t('user.role')" prop="roleNames" align="center"/>
-              <Column :label="$t('user.agent')" prop="agentName" align="center"/>
+              <Column :label="$t('user.agent')" prop="agentName">
+                <template #default="{ row }">
+                  <span v-if="row.deptId == 0">{{ $t('common.head') }}</span>
+                  <span v-else>{{ row.agentName }}</span>
+                </template>
+              </Column>
               <Column :label="$t('trainList.trainResult')" prop="trainCompleteFlag" align="center">
                 <template #default="{ row }">
                   <el-tag v-if="row.trainCompleteFlag === '0'" type="danger">{{ row.trainCompleteFlagName }}</el-tag>
@@ -262,7 +266,12 @@
             <span>{{ row.roleNames }}</span>
           </template>
         </Column>
-        <Column :label="$t('user.agent')" prop="agentName" :searchParams="userQueryParams" :showSearch="true"/>
+        <Column :label="$t('user.agent')" prop="agentName" :searchParams="userQueryParams" :showSearch="true">
+          <template #default="{ row }">
+            <span v-if="row.deptId == 0">{{ $t('common.head') }}</span>
+            <span v-else>{{ row.agentName }}</span>
+          </template>
+        </Column>
       </card-table>
       <div slot="footer" class="dialog-footer">
         <el-button icon="el-icon-circle-check" type="primary" @click="submitTrainTargetsForm">{{

+ 47 - 35
ruoyi-ui-vue2/src/views/train/trainlist/index.vue

@@ -2,7 +2,7 @@
   <div v-loading="pageLoading" class="app-container">
     <card-table :delProp="['createTime']" :loading="loading" :modalData="trainingList" :searchParams="queryParams"
                 :tableSearch="true" labelWidth="120px" @columnSearch="handleQuery" @pagination="getList"
-                @selection-change="handleSelectionChange" @resetList="resetQuery" >
+                @selection-change="handleSelectionChange" @resetList="resetQuery">
       <template #operations="{ selections }">
         <el-button v-hasPermi="['train:list:add']" icon="el-icon-plus" size="mini" type="primary"
                    @click="handleAdd">{{ $t('trainList.addTrain') }}
@@ -28,9 +28,9 @@
                           :label-color="statusColorMap[row.trainStatus].color"
             />
           </template>
-<!--          <template #default="{ row }">-->
-<!--            <span>{{ row.trainStatusName }}</span>-->
-<!--          </template>-->
+          <!--          <template #default="{ row }">-->
+          <!--            <span>{{ row.trainStatusName }}</span>-->
+          <!--          </template>-->
         </Column>
         <!--培训类别-->
         <Column :label="$t('trainList.trainingCategory')" prop="trainType"
@@ -42,10 +42,10 @@
           </template>
         </Column>
         <!--培训对象 -->
-<!--        <Column :label="$t('trainList.trainingTargets')" :searchParams="queryParams"-->
-<!--                :showSearch="true"-->
-<!--                prop="trainingTargets">-->
-<!--        </Column>-->
+        <!--        <Column :label="$t('trainList.trainingTargets')" :searchParams="queryParams"-->
+        <!--                :showSearch="true"-->
+        <!--                prop="trainingTargets">-->
+        <!--        </Column>-->
         <!--开始时间-->
         <Column :label="$t('trainList.startTime')" prop="startDate" :searchParams="queryParams"
                 :showSearch="true" searchType="dateRange" prop-start="startDateS" prop-end="startDateE">
@@ -88,10 +88,15 @@
             <el-button v-hasPermi="['train:list:view']" icon="el-icon-view" size="mini"
                        type="text" @click="handleView(row)">{{ $t('common.view') }}
             </el-button>
-            <el-button v-hasPermi="['train:list:edit']" icon="el-icon-edit" size="mini"
+            <el-button v-if="row.trainStatus === '01'" v-hasPermi="['train:list:terminate']" icon="el-icon-video-pause"
+                       size="mini"
+                       type="text" @click="handleTerminate(row)">{{ $t('trainList.terminate') }}
+            </el-button>
+            <el-button v-if="row.trainStatus === '00'" v-hasPermi="['train:list:edit']" icon="el-icon-edit" size="mini"
                        type="text" @click="handleUpdate(row)">{{ $t('common.edit') }}
             </el-button>
-            <el-button v-hasPermi="['train:list:delete']" icon="el-icon-delete" size="mini"
+            <el-button v-if="row.trainStatus === '00'" v-hasPermi="['train:list:delete']" icon="el-icon-delete"
+                       size="mini"
                        type="text" @click="handleDelete(row)">{{ $t('common.delete') }}
             </el-button>
             <el-button v-hasPermi="['train:list:addAgain']" icon="el-icon-circle-plus-outline" size="mini"
@@ -103,7 +108,6 @@
     </card-table>
 
 
-
   </div>
 </template>
 
@@ -115,10 +119,11 @@ import DatePicker from "@/components/element/form/items/DatePicker.vue";
 import {getUser, listUser} from '@/api/system/user'
 import CardTable from "@/components/element/table/CardTable.vue";
 import DatabaseDialog from "@/views/train/trainlist/detail/databaseDialog.vue";
-import {listTrain,getTrain,addTrain,updateTrain,delTrain} from '@/api/train/train'
+import {listTrain, getTrain, addTrain, updateTrain, delTrain, terminateTrain} from '@/api/train/train'
 
 import ImportModal from "@/components/ImportModal/index.vue";
 import ColorDictTag from "@/views/crmManagement/lead/ColorDictTag/index.vue";
+
 const statusColorMap = {
   '00': {
     color: '#FFC500',
@@ -132,11 +137,15 @@ const statusColorMap = {
     color: '#8B71FD',
     bgc: 'rgba(139,113,253,0.12)'
   },
+  '03': {
+    color: '#D71943',
+    bgc: '#FAEDED'
+  },
 }
 export default {
   name: "TrainList",
-  components: {ColorDictTag, ImportModal, CardTable, DatePicker, Column,DatabaseDialog},
-  dicts: ['train_whether_to_assess', 'training_category','train_status','train_question_type'],
+  components: {ColorDictTag, ImportModal, CardTable, DatePicker, Column, DatabaseDialog},
+  dicts: ['train_whether_to_assess', 'training_category', 'train_status', 'train_question_type'],
   data() {
     return {
       statusColorMap: statusColorMap,
@@ -199,9 +208,9 @@ export default {
     // 培训列表获取
     getList() {
       this.loading = true;
-      let {trainStatus,trainType,createTime,startDate,endDate,...params} = this.queryParams;
+      let {trainStatus, trainType, createTime, startDate, endDate, ...params} = this.queryParams;
       listTrain(params).then(response => {
-        console.log("response=====>",response);
+        console.log("response=====>", response);
         this.trainingList = response.rows
         this.queryParams.total = response.total
         this.trainingList.forEach(item => {
@@ -223,9 +232,7 @@ export default {
 
     // 表单重置
     reset() {
-      this.form = {
-
-      };
+      this.form = {};
       this.resetForm("form");
       this.countryOptions = [];
       this.areaTree = [];
@@ -269,13 +276,7 @@ export default {
 
     /** 新增按钮操作 */
     async handleAdd() {
-      let query = {
-        data: JSON.stringify([{}, {}]) // 将数组转换为字符串
-      };
-      this.$router.push({
-        path: "/train/trainlist/detail/addTrain",
-        query: query
-      });
+      this.$tab.openPage(this.$t('trainList.addTrain'), '/train/trainlist/detail/addTrain')
     },
 
     /** 修改按钮操作 */
@@ -283,21 +284,15 @@ export default {
       let query = {
         id: row.id
       };
-      this.$router.push({
-        path: "/train/trainlist/detail/addTrain",
-        query: query
-      });
+      this.$tab.openPage(this.$t('trainList.editTrain'), '/train/trainlist/detail/addTrain', query)
     },
     /** 再次发起*/
-    handleAddAgain(row){
+    handleAddAgain(row) {
       let query = {
         id: row.id,
         type: 'addAgain'
       };
-      this.$router.push({
-        path: "/train/trainlist/detail/addTrain",
-        query: query
-      });
+      this.$tab.openPage(this.$t('trainList.addAgain'), '/train/trainlist/detail/addTrain', query)
     },
     // 查看
     handleView(row) {
@@ -319,6 +314,23 @@ export default {
       }
     },
 
+    /** 终止培训 */
+    async handleTerminate(row) {
+      try {
+        const trainIds = row.id || this.ids;
+        await this.$modal.confirm(this.$t('trainList.isTerminate'));
+        this.pageLoading = true;
+        console.log("trainIds", trainIds)
+        await terminateTrain(trainIds);
+        this.$modal.msgSuccess(this.$t('common.deactivatSuccess'));
+      } catch (error) {
+        console.log("error",error)
+        // 处理错误
+      } finally {
+        this.pageLoading = false;
+        this.getList()
+      }
+    },
 
     /** 导出按钮操作 */
     handleExport() {