ct 18 часов назад
Родитель
Сommit
5c1ca9dbee
41 измененных файлов с 808 добавлено и 874 удалено
  1. 23 20
      .env.development
  2. 22 19
      .env.prod-jnmy
  3. 9 0
      src/api/course/sopLogs.js
  4. 36 0
      src/utils/sopVoice.js
  5. 5 5
      src/views/components/his/articleDetails.vue
  6. 4 4
      src/views/components/his/caseArticleDetails.vue
  7. 5 5
      src/views/components/his/chineseMedicineDetails.vue
  8. 6 6
      src/views/components/his/diseaseDetails.vue
  9. 5 5
      src/views/components/his/doctorArticleDetails.vue
  10. 5 5
      src/views/components/his/drugReportDetails.vue
  11. 6 6
      src/views/components/his/famousPrescribeDetails.vue
  12. 34 34
      src/views/components/his/followMsgDetails.vue
  13. 4 4
      src/views/components/his/integralGoodsDetails.vue
  14. 2 2
      src/views/components/his/medicatedFoodDetails.vue
  15. 35 35
      src/views/components/his/msgDetails.vue
  16. 12 12
      src/views/components/his/packageDetails.vue
  17. 1 1
      src/views/components/his/storeOrderDetails.vue
  18. 1 1
      src/views/components/his/storeOrderDetails2.vue
  19. 10 10
      src/views/components/his/storeProductDetails.vue
  20. 4 4
      src/views/components/his/vesselDetails.vue
  21. 25 6
      src/views/course/courseFinishTemp/index.vue
  22. 25 6
      src/views/course/courseFinishTempParent/index.vue
  23. 38 259
      src/views/course/courseQuestionBank/index.vue
  24. 64 31
      src/views/course/sopLogs/sopLogsList.vue
  25. 20 186
      src/views/course/userCourseCategory/index.vue
  26. 34 34
      src/views/crm/customer/line.vue
  27. 2 2
      src/views/his/reward/goodsDetail.vue
  28. 5 5
      src/views/hisStore/components/chineseMedicineDetails.vue
  29. 6 6
      src/views/hisStore/components/diseaseDetails.vue
  30. 4 4
      src/views/hisStore/components/doctorArticleDetails.vue
  31. 6 6
      src/views/hisStore/components/famousPrescribeDetails.vue
  32. 4 4
      src/views/hisStore/components/integralGoodsDetails.vue
  33. 2 2
      src/views/hisStore/components/medicatedFoodDetails.vue
  34. 4 4
      src/views/hisStore/components/vesselDetails.vue
  35. 48 48
      src/views/hisStore/storeOrder/promotionList.vue
  36. 249 61
      src/views/qw/sopLogs/sopLogsList.vue
  37. 3 2
      src/views/qw/sopTemp/addSopTemp.vue
  38. 18 10
      src/views/qw/sopTemp/updateSopTemp.vue
  39. 2 1
      src/views/qw/sopUserLogs/sopUserLogsSchedule.vue
  40. 2 1
      src/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue
  41. 18 18
      src/views/tool/gen/index.vue

+ 23 - 20
.env.development

@@ -1,53 +1,56 @@
 # 页�标题
-VUE_APP_TITLE =互�网医院管�系�
+VUE_APP_TITLE =互�网医院管�系统
 # 首页��标题
-VUE_APP_TITLE_INDEX =互�网医�
+VUE_APP_TITLE_INDEX =互�网医院
 # 公��称
 VUE_APP_COMPANY_NAME =
-# ICP备案�
-VUE_APP_ICP_RECORD =陕ICP�025066365�3
+# ICP备案�
+VUE_APP_ICP_RECORD =闽ICP备2025066365�-3
 # ICP网站访问地�
 VUE_APP_ICP_URL =https://beian.miit.gov.cn
 # 网站LOG
 VUE_APP_LOG_URL =@/assets/logo/xfk.png
-# 存储桶��
-VUE_APP_OBS_ACCESS_KEY_ID = 
-# 存储桶��
-VUE_APP_OBS_SECRET_ACCESS_KEY = 
-# 存储桶��
+# 存储桶�置
+VUE_APP_OBS_ACCESS_KEY_ID =
+# 存储桶�置
+VUE_APP_OBS_SECRET_ACCESS_KEY =
+# 存储桶�置
 VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
-# 存储桶��
+# 存储桶�置
 VUE_APP_OBS_BUCKET = xfk-hw079058881
-# 存储桶��
+# 存储桶�置
 VUE_APP_COS_BUCKET = xfk-1323137866
-# 存储桶��
+# 存储桶�置
 VUE_APP_COS_REGION = ap-chongqing
 # 线路一地�
 VUE_APP_VIDEO_LINE_1 = https://xfktcpv.ylrzcloud.com
 # 线路二地�
 VUE_APP_VIDEO_LINE_2 = https://xfkobs.ylrztop.com
-#�山云视频地�域�
+# �山云视频地�域�
 VUE_APP_VIDEO_URL = https://myhkvolcengine.ylrztop.com
-#�山云视频点播空间�
+# �山云视频点播空间�
 VUE_APP_HSY_SPACE = myhk-2114522511
-#直播解�路径
+# 直播解�路径
 LIVE_PATH = /live
 
 VUE_APP_LIVE_WS_URL = ws://127.0.0.1:7114/ws
 
 
-# 开�环境��
+# 开�环境�置
 ENV = 'development'
 
-# FS管�系统/开�环�
+# FS管�系统/开�环境
 VUE_APP_BASE_API = '/prod-api'
 
-#默认 1�会�2���
+# 默认 1�会员 2��微
 VUE_APP_COURSE_DEFAULT = 1
 
-# 路由懒加�
+# SOP 语音/APP语音:false=��且已有项仅�删;��改为 true 或删除本行
+VUE_APP_SOP_VOICE_ENABLE=false
+
+# 路由�加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
-# 患者信�
+# 患者信�
 VUE_APP_PATIENT_INFO = '客户信�'
 # 添加病人
 VUE_APP_ADD_PATIENT = '添加信�'

+ 22 - 19
.env.prod-jnmy

@@ -1,45 +1,48 @@
 # 页�标题
-VUE_APP_TITLE =金牛明医互�网医院管�系�
+VUE_APP_TITLE =金牛明医互�网医院管�系统
 # 首页��标题
 VUE_APP_TITLE_INDEX =金牛明医
 # 公��称
-VUE_APP_COMPANY_NAME =�都金牛明医云�互�网医院有�公�
-# ICP备案�
-VUE_APP_ICP_RECORD =蜀ICP�024052643�
+VUE_APP_COMPANY_NAME =�都金牛明医云�互�网医院有�公�
+# ICP备案�
+VUE_APP_ICP_RECORD =蜀ICP备2024052643�
 # ICP网站访问地�
 VUE_APP_ICP_URL =https://beian.miit.gov.cn
 # 网站LOG
 VUE_APP_LOG_URL =@/assets/logo/jnmy.png
-# 存储桶��
-VUE_APP_OBS_ACCESS_KEY_ID = 
-# 存储桶��
-VUE_APP_OBS_SECRET_ACCESS_KEY = 
-# 存储桶��
+# 存储桶�置
+VUE_APP_OBS_ACCESS_KEY_ID =
+# 存储桶�置
+VUE_APP_OBS_SECRET_ACCESS_KEY =
+# 存储桶�置
 VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
-# 存储桶��
+# 存储桶�置
 VUE_APP_OBS_BUCKET = jnmy-hw079058881
-# 存储桶��
+# 存储桶�置
 VUE_APP_COS_BUCKET = jnmy-1323137866
-# 存储桶��
+# 存储桶�置
 VUE_APP_COS_REGION = ap-chongqing
 # 线路一地�
 VUE_APP_VIDEO_LINE_1 = https://jnmytcpv.ylrzcloud.com
 # 线路二地�
 VUE_APP_VIDEO_LINE_2 = https://jnmyobs.ylrztop.com
 
-#�山云视频地�域�
+# �山云视频地�域�
 VUE_APP_VIDEO_URL = https://cdjnmyvolcengine.ylrztop.com
-#�山云视频点播空间�
+# �山云视频点播空间�
 VUE_APP_HSY_SPACE = cdjnmy-2114522511
 
-# 开�环境��
-ENV = 'development'
+# 环境�置
+ENV = 'production'
 
-# FS管�系统/开�环�
+# FS管�系统
 VUE_APP_BASE_API = '/prod-api'
 
-#默认 1�会�2���
+# 默认 1�会员 2��微
 VUE_APP_COURSE_DEFAULT = 2
 
-# 路由懒加�
+# SOP语音开关 false关闭 true开�
+VUE_APP_SOP_VOICE_ENABLE=false
+
+# 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 9 - 0
src/api/course/sopLogs.js

@@ -9,6 +9,15 @@ export function listSopLogs(query) {
   })
 }
 
+// 查询看课SOP  定时任务列表(含客户信息)
+export function listSopLogsCVOList(query) {
+  return request({
+    url: '/course/sopLogs/CVOList',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询看课SOP  定时任务详细
 export function getSopLogs(id) {
   return request({

+ 36 - 0
src/utils/sopVoice.js

@@ -0,0 +1,36 @@
+/** SOP 内容类别:语音 / APP语音 */
+export const SOP_VOICE_TYPES = ['7', '16']
+
+/**
+ * 是否允许新增/编辑 SOP 语音、APP语音。
+ * 在对应环境 .env 中配置 VUE_APP_SOP_VOICE_ENABLE=false 即可关闭;恢复时改为 true 或删除该配置。
+ * 未配置时默认开启,不影响其它客户。
+ */
+export function isSopVoiceEnabled() {
+  return process.env.VUE_APP_SOP_VOICE_ENABLE !== 'false'
+}
+
+export function isSopVoiceType(contentType) {
+  return SOP_VOICE_TYPES.includes(String(contentType))
+}
+
+/** 新增场景:从字典中去掉语音、APP语音选项 */
+export function filterSopContentTypes(list) {
+  if (isSopVoiceEnabled()) {
+    return list || []
+  }
+  return (list || []).filter(item => !isSopVoiceType(item.dictValue))
+}
+
+/** 已有语音/APP语音内容:关闭开关后仅可删除,不可改 */
+export function isSopVoiceLocked(contentType) {
+  return !isSopVoiceEnabled() && isSopVoiceType(contentType)
+}
+
+/** 内容类别 radio:关闭开关时隐藏语音类;当前已是该类则仍展示(便于识别后删除) */
+export function showSopContentTypeOption(dictValue, currentType) {
+  if (isSopVoiceEnabled() || !isSopVoiceType(dictValue)) {
+    return true
+  }
+  return String(currentType) === String(dictValue)
+}

+ 5 - 5
src/views/components/his/articleDetails.vue

@@ -6,7 +6,7 @@
 <div class="contentx" >
   <div class="desct"> �康知识详情</div>
  <el-descriptions title="" :column="3" border>
-            <el-descriptions-item label="��� >
+            <el-descriptions-item label="��图" >
                  <img :src="item.imageUrl" style="max-width: 150px;">
             </el-descriptions-item>
             <el-descriptions-item label="分类" >
@@ -18,13 +18,13 @@
                 <span v-if="item!=null">{{item.title}}</span>
             </el-descriptions-item>
 
-            <el-descriptions-item label="�览� >
+            <el-descriptions-item label="�览�" >
                 <span v-if="item!=null">{{item.views}}</span>
             </el-descriptions-item>
               <el-descriptions-item label="是�推�" >
             <dict-tag v-if="item.isTui!=null" :options="isTuiOptions" :value="item.isTui"/>
             </el-descriptions-item>
-            <el-descriptions-item label="是�最� >
+            <el-descriptions-item label="是�最新" >
                    <dict-tag :options="isNewsOptions" :value="item.isNews"/>
             </el-descriptions-item>
             <el-descriptions-item label="�布时间"  >
@@ -37,7 +37,7 @@
                 <span v-if="item!=null">{{item.updateTime}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="内容" >
-                <span v-safe-html="item.contents"></span>
+                <span v-html="item.contents"></span>
             </el-descriptions-item>
         </el-descriptions>
 
@@ -56,7 +56,7 @@ import { listCate} from "@/api/his/articleCate";
         cateName:null,
         // 是�推�字典
         isTuiOptions: [],
-        // 是�最新字�
+        // 是�最新字典
         isNewsOptions: [],
         item:null,
       }

+ 4 - 4
src/views/components/his/caseArticleDetails.vue

@@ -6,7 +6,7 @@
 <div class="contentx" >
   <div class="desct"> 医案科普详情</div>
  <el-descriptions title="" :column="3" border>
-            <el-descriptions-item label="��� >
+            <el-descriptions-item label="��图" >
               <el-image
                       style="width: 100px"
                       :src="item.imgUrl"
@@ -17,7 +17,7 @@
             <el-descriptions-item label="标题" >
                 <span v-if="item!=null">{{item.title}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="�览� >
+            <el-descriptions-item label="�览�" >
                 <span v-if="item!=null">{{item.views}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="创建时间" >
@@ -27,7 +27,7 @@
                 <span v-if="item!=null">{{item.updateTime}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="内容" >
-                <span v-safe-html="item.contents"></span>
+                <span v-html="item.contents"></span>
             </el-descriptions-item>
         </el-descriptions>
 
@@ -44,7 +44,7 @@ import { listCaseArticle, getCaseArticle, delCaseArticle, addCaseArticle, update
       return {
         // 医案科普分类字典
         articleTypeOptions: [],
-        // 状�字�
+        // 状�字典
         statusOptions: [],
         item:null,
       }

+ 5 - 5
src/views/components/his/chineseMedicineDetails.vue

@@ -15,14 +15,14 @@
           </el-descriptions-item>
           <el-descriptions-item label="中��称"><span v-if="item!=null">{{item.medicineName}}</span></el-descriptions-item>
           <el-descriptions-item label="排�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
-          <el-descriptions-item label="状�><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="状�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="是�常�"><span v-if="item!=null"><dict-tag :options="isUsualOptions" :value="item.isUsual"/></span></el-descriptions-item>
           <el-descriptions-item label="归�"><span v-if="item!=null">{{item.vessel}}</span></el-descriptions-item>
           <el-descriptions-item label="五味"span="3"><span v-if="item!=null">{{item.flavor}}</span></el-descriptions-item>
-          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-safe-html="item.action"></span></span></el-descriptions-item>
-          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-safe-html="item.usageMethod"></span></span></el-descriptions-item>
-          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-safe-html="item.descs"></span></span></el-descriptions-item>
-          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-safe-html="item.msg"></span></span></el-descriptions-item>
+          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-html="item.action"></span></span></el-descriptions-item>
+          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-html="item.usageMethod"></span></span></el-descriptions-item>
+          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-html="item.descs"></span></span></el-descriptions-item>
+          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-html="item.msg"></span></span></el-descriptions-item>
         </el-descriptions>
     </div>
 

+ 6 - 6
src/views/components/his/diseaseDetails.vue

@@ -17,12 +17,12 @@
             <el-descriptions-item label="疾病编�" >
                 <span v-if="item!=null">{{item.diseaseCode}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="所属科� >
+            <el-descriptions-item label="所属科室" >
                 <span v-if="item!=null">{{item.deptName}}</span>
             </el-descriptions-item>
 
 
-            <el-descriptions-item label="状� >
+            <el-descriptions-item label="状�" >
              <span v-if="item!=null">
                    <dict-tag :options="statusOptions" :value="item.status"/>
              </span>
@@ -30,7 +30,7 @@
             <el-descriptions-item label="创建时间" >
                 <span v-if="item!=null">{{item.createTime}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="简� span="6">
+            <el-descriptions-item label="简介" span="6">
                 <span v-if="item!=null">{{item.introduction}}</span>
             </el-descriptions-item>
 
@@ -38,11 +38,11 @@
                 <span v-if="item!=null">{{item.diagnose}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="症状" span="6">
-                      <span v-safe-html="item.symptom"></span>
+                      <span v-html="item.symptom"></span>
 
             </el-descriptions-item>
-            <el-descriptions-item label="检� span="6">
-                      <span v-safe-html="item.inspect"></span>
+            <el-descriptions-item label="检验" span="6">
+                      <span v-html="item.inspect"></span>
             </el-descriptions-item>
         </el-descriptions>
     </div>

+ 5 - 5
src/views/components/his/doctorArticleDetails.vue

@@ -12,10 +12,10 @@
             <el-descriptions-item label="文章ID"  >
                 <span v-if="item!=null">{{item.articleId}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="作� >
+            <el-descriptions-item label="作者" >
                 <span v-if="item!=null">{{item.doctorName}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="��� >
+            <el-descriptions-item label="��图" >
                 <el-popover v-if="item.imageUrl!=null"
                           placement="right"
                           title=""
@@ -31,11 +31,11 @@
                 <span v-if="item!=null">{{item.title}}</span>
             </el-descriptions-item>
 
-            <el-descriptions-item label="�览� >
+            <el-descriptions-item label="�览�" >
                 <span v-if="item!=null">{{item.views}}</span>
             </el-descriptions-item>
 
-            <el-descriptions-item label="状� >
+            <el-descriptions-item label="状�" >
              <span v-if="item!=null">
                    <dict-tag :options="articleStatus" :value="item.status"/>
              </span>
@@ -47,7 +47,7 @@
                 <span v-if="item!=null">{{item.updateTime}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="内容" >
-                <span v-safe-html="item.content"></span>
+                <span v-html="item.content"></span>
             </el-descriptions-item>
 
 

+ 5 - 5
src/views/components/his/drugReportDetails.vue

@@ -9,14 +9,14 @@
     <el-descriptions-item label="订�编�"><span v-if="item!=null">{{item.orderCode}}</span></el-descriptions-item>
     <el-descriptions-item label="病人�称"><span v-if="item!=null">{{item.patientName}}</span></el-descriptions-item>
     <el-descriptions-item label="医生�称"><span v-if="item!=null">{{item.doctorNane}}</span></el-descriptions-item>
-    <el-descriptions-item label="状�><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+    <el-descriptions-item label="状�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
     <el-descriptions-item label="咨询总结"><span v-if="item!=null">{{item.reportSummary}}</span></el-descriptions-item>
     <el-descriptions-item label="生活建议"span="3"><span v-if="item!=null">{{item.reportAdvice}}</span></el-descriptions-item>
     <el-descriptions-item label="备注"span="3"><span v-if="item!=null">{{item.remark}}</span></el-descriptions-item>
-    <el-descriptions-item label="评分"span="3"><span v-if="item!=null"><span v-safe-html="item.pingStar"></span></span></el-descriptions-item>
-    <el-descriptions-item label="评价" span="3"><span v-if="item!=null"> <span v-safe-html="item.pingContent"></span></span></el-descriptions-item>
-    <el-descriptions-item label="评价时间" span="3"><span v-if="item!=null"> <span v-safe-html="item.pingTime"></span></span></el-descriptions-item>
-    <el-descriptions-item label="创建时间" span="3"><span v-if="item!=null"> <span v-safe-html="item.createTime"></span></span></el-descriptions-item>
+    <el-descriptions-item label="评分"span="3"><span v-if="item!=null"><span v-html="item.pingStar"></span></span></el-descriptions-item>
+    <el-descriptions-item label="评价" span="3"><span v-if="item!=null"> <span v-html="item.pingContent"></span></span></el-descriptions-item>
+    <el-descriptions-item label="评价时间" span="3"><span v-if="item!=null"> <span v-html="item.pingTime"></span></span></el-descriptions-item>
+    <el-descriptions-item label="创建时间" span="3"><span v-if="item!=null"> <span v-html="item.createTime"></span></span></el-descriptions-item>
   </el-descriptions>
   </div>
 </div>

+ 6 - 6
src/views/components/his/famousPrescribeDetails.vue

@@ -15,14 +15,14 @@
             </el-descriptions-item>
           <el-descriptions-item label="�典�方�称"><span v-if="item!=null">{{item.prescribeName}}</span></el-descriptions-item>
           <el-descriptions-item label="排�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
-          <el-descriptions-item label="状�><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="状�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="方剂类型"><span v-if="item!=null"> <dict-tag :options="prescribeTypeOptions" :value="item.prescribeType"/></span></el-descriptions-item>
            <el-descriptions-item label="主治疾病"><span v-if="item!=null">{{item.indication}}</span></el-descriptions-item>
           <el-descriptions-item label="归属书�" span="3"><span v-if="item!=null">{{item.belongBook}}</span></el-descriptions-item>
-          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-safe-html="item.action"></span></span></el-descriptions-item>
-          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-safe-html="item.usageMethod"></span></span></el-descriptions-item>
-          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-safe-html="item.descs"></span></span></el-descriptions-item>
-          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-safe-html="item.msg"></span></span></el-descriptions-item>
+          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-html="item.action"></span></span></el-descriptions-item>
+          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-html="item.usageMethod"></span></span></el-descriptions-item>
+          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-html="item.descs"></span></span></el-descriptions-item>
+          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-html="item.msg"></span></span></el-descriptions-item>
           <el-descriptions-item label="创建时间"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
 
         </el-descriptions>
@@ -40,7 +40,7 @@ import { listFamousPrescribe, getFamousPrescribe, delFamousPrescribe, addFamousP
       return {
         // 方剂类型字典
         prescribeTypeOptions: [],
-        // 状�字�
+        // 状�字典
         statusOptions: [],
         item:null,
       }

+ 34 - 34
src/views/components/his/followMsgDetails.vue

@@ -18,7 +18,7 @@
             <div v-if="lt.msgContentType == '4'" :class="{ 'right': lt.msgType == '2'}">
               <video  :src="lt.content" controls style="max-width: 400px; max-height: 400px;"></video>
             </div>
-            <span v-if="lt.msgContentType == '5'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="getPrescribe(JSON.parse(lt.content).prescribeId)">处方�/el-link></span>
+            <span v-if="lt.msgContentType == '5'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="getPrescribe(JSON.parse(lt.content).prescribeId)">处方�</el-link></span>
             <span v-if="lt.msgContentType == '6'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="report(lt.content)">问诊报告</el-link></span>
             <span v-if="lt.msgContentType == '7'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="follow(lt.content)">�访</el-link></span>
             <span v-if="lt.msgContentType == '8'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="drugReport(lt.content)">用�报告</el-link></span>
@@ -41,7 +41,7 @@
       @pagination="msgList"
     />
     <el-dialog
-      title="�访�
+      title="�访�"
       :visible.sync="followDialogVisible"
       width="80%"
       :before-close="handleCloseSF" append-to-body >
@@ -75,31 +75,31 @@
       </div>
 
       <span slot="footer" class="dialog-footer">
-        <el-button @click="followDialogVisible = false">��/el-button>
-        <el-button type="primary" @click="followDialogVisible = false">ç¡?å®?/el-button>
+        <el-button @click="followDialogVisible = false">� 消</el-button>
+        <el-button type="primary" @click="followDialogVisible = false">确 定</el-button>
       </span>
     </el-dialog>
-    <el-dialog title="处方� :visible.sync="prescribeDialog.open" width="80%" :before-close="handleClose" append-to-body >
+    <el-dialog title="处方�" :visible.sync="prescribeDialog.open" width="80%" :before-close="handleClose" append-to-body >
       <div class="desct">
         基本信�
       </div>
       <el-descriptions :column="3" border  >
-        <el-descriptions-item label="处方�编�  >
+        <el-descriptions-item label="处方�编�"  >
             <span v-if="prescribeItem!=null">
               {{prescribeItem.prescribeCode}}
             </span>
         </el-descriptions-item>
         <el-descriptions-item label="病情�述"  > <span v-if="prescribeItem!=null">{{prescribeItem.patientDescs}}</span></el-descriptions-item>
         <el-descriptions-item label="诊断"  > <span v-if="prescribeItem!=null">{{prescribeItem.diagnose}}</span></el-descriptions-item>
-        <el-descriptions-item label="既往� ><span v-if="prescribeItem!=null">{{prescribeItem.historyIllness}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者年� > <span v-if="prescribeItem!=null">{{prescribeItem.patientAge}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者姓� > <span v-if="prescribeItem!=null">{{prescribeItem.patientName}}</span> </el-descriptions-item>
+        <el-descriptions-item label="既往�" ><span v-if="prescribeItem!=null">{{prescribeItem.historyIllness}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者年龄" > <span v-if="prescribeItem!=null">{{prescribeItem.patientAge}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者姓�" > <span v-if="prescribeItem!=null">{{prescribeItem.patientName}}</span> </el-descriptions-item>
         <el-descriptions-item label="是�有过��" > <dict-tag :options="orOptions" :value="prescribeItem.historyAllergic"/></el-descriptions-item>
-        <el-descriptions-item label="过�� ><span v-if="prescribeItem!=null">{{prescribeItem.weight}}</span></el-descriptions-item>
-        <el-descriptions-item label="�功能是�异� ><span v-if="prescribeItem!=null">{{prescribeItem.liverUnusual}}</span> </el-descriptions-item>
-        <el-descriptions-item label="肾功能是�异� > <span v-if="prescribeItem!=null">{{prescribeItem.renalUnusual}}</span> </el-descriptions-item>
-        <el-descriptions-item label="是�是备�怀�哺乳� > <dict-tag :options="orOptions" :value="prescribeItem.isLactation"/> </el-descriptions-item>
-        <el-descriptions-item label="患者电� >  <span v-if="prescribeItem!=null">{{prescribeItem.patientTel}}</span> </el-descriptions-item>
+        <el-descriptions-item label="过��" ><span v-if="prescribeItem!=null">{{prescribeItem.weight}}</span></el-descriptions-item>
+        <el-descriptions-item label="�功能是�异常" ><span v-if="prescribeItem!=null">{{prescribeItem.liverUnusual}}</span> </el-descriptions-item>
+        <el-descriptions-item label="肾功能是�异常" > <span v-if="prescribeItem!=null">{{prescribeItem.renalUnusual}}</span> </el-descriptions-item>
+        <el-descriptions-item label="是�是备孕/怀孕/哺乳期" > <dict-tag :options="orOptions" :value="prescribeItem.isLactation"/> </el-descriptions-item>
+        <el-descriptions-item label="患者电�" >  <span v-if="prescribeItem!=null">{{prescribeItem.patientTel}}</span> </el-descriptions-item>
         <el-descriptions-item label="�师�称" > <span v-if="prescribeItem!=null">{{prescribeItem.doctorDrugName}}</span>  </el-descriptions-item>
         <el-descriptions-item label="医生�称" > <span v-if="prescribeItem!=null">{{prescribeItem.doctorName}}</span> </el-descriptions-item>
         <el-descriptions-item label="审核时间" > <span v-if="prescribeItem!=null">{{prescribeItem.auditTime}}</span></el-descriptions-item>
@@ -141,12 +141,12 @@
       </el-table>
       <div style="height: 30px;">
         <div style="float: right;margin: 20px" v-if="prescribeItem.prescribeType==2">
-          剂数�span class="color-danger">{{JSON.parse(prescribeItem.usageJson).counts}}</span>
+          剂数:<span class="color-danger">{{JSON.parse(prescribeItem.usageJson).counts}}</span>
         </div>
       </div>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="prescribeDialog.open = false">��/el-button>
-        <el-button type="primary" @click="prescribeDialog.open = false">ç¡?å®?/el-button>
+        <el-button @click="prescribeDialog.open = false">� 消</el-button>
+        <el-button type="primary" @click="prescribeDialog.open = false">确 定</el-button>
       </span>
     </el-dialog>
 
@@ -156,15 +156,15 @@
       </div>
       <el-descriptions :column="3" border  >
         <el-descriptions-item label="报告编�"><span v-if="reportItem!=null">{{reportItem.reportSn}}</span></el-descriptions-item>
-        <el-descriptions-item label="状�><span v-if="reportItem!=null"><dict-tag :options="statusOptions" :value="reportItem.status"/></span></el-descriptions-item>
+        <el-descriptions-item label="状�"><span v-if="reportItem!=null"><dict-tag :options="statusOptions" :value="reportItem.status"/></span></el-descriptions-item>
         <el-descriptions-item label="会员昵称"><span v-if="reportItem!=null">{{reportItem.nickName}}</span></el-descriptions-item>
         <el-descriptions-item label="会员电�"><span v-if="reportItem!=null">{{reportItem.phone}}</span></el-descriptions-item>
         <el-descriptions-item label="医生�称"><span v-if="reportItem!=null">{{reportItem.doctorName}}</span></el-descriptions-item>
-        <el-descriptions-item label="问诊�类� ><dict-tag :options="inquirySubTypeOptions" :value="reportItem.inquirySubType"/></el-descriptions-item>
+        <el-descriptions-item label="问诊�类型" ><dict-tag :options="inquirySubTypeOptions" :value="reportItem.inquirySubType"/></el-descriptions-item>
         <el-descriptions-item label="优惠劵��人"><span v-if="reportItem!=null">{{reportItem.sendName}}</span></el-descriptions-item>
         <el-descriptions-item label="主诉"><span v-if="reportItem!=null">{{reportItem.patientDescs}}</span></el-descriptions-item>
-        <el-descriptions-item label="疾病�><span v-if="reportItem!=null">{{reportItem.illnessLogs}}</span></el-descriptions-item>
-        <el-descriptions-item label="用��><span v-if="reportItem!=null">{{reportItem.drugLogs}}</span></el-descriptions-item>
+        <el-descriptions-item label="疾病历"><span v-if="reportItem!=null">{{reportItem.illnessLogs}}</span></el-descriptions-item>
+        <el-descriptions-item label="用��"><span v-if="reportItem!=null">{{reportItem.drugLogs}}</span></el-descriptions-item>
         <el-descriptions-item label="诊断结果"><span v-if="reportItem!=null">{{reportItem.inquiryResult}}</span></el-descriptions-item>
         <el-descriptions-item label="备注"><span v-if="reportItem!=null">{{reportItem.remark}}</span></el-descriptions-item>
         <el-descriptions-item label="医生签�"><span v-if="reportItem.signUrl!=null"><img :src="reportItem.signUrl" style="max-width: 100px;"></span></el-descriptions-item>
@@ -176,9 +176,9 @@
         ${process.env.VUE_APP_VIDEO_LINE_1}
       </div>
       <el-descriptions :column="3" border  >
-        <el-descriptions-item label="患者姓� ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).patientName}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者年� ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).age}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者性别" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).sex==1?'�:'�}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者姓�" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).patientName}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者年龄" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).age}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者性别" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).sex==1?'男':'女'}}</span></el-descriptions-item>
         <el-descriptions-item label="身份��" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).idCard}}</span></el-descriptions-item>
         <el-descriptions-item label="体�" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).weight}}</span></el-descriptions-item>
         <el-descriptions-item label="身高" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).height}}</span></el-descriptions-item>
@@ -221,8 +221,8 @@
         </el-descriptions>
       </div>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="reportDialogVisible = false">��/el-button>
-        <el-button type="primary" @click="reportDialogVisible = false">ç¡?å®?/el-button>
+        <el-button @click="reportDialogVisible = false">� 消</el-button>
+        <el-button type="primary" @click="reportDialogVisible = false">确 定</el-button>
       </span>
     </el-dialog>
     <el-dialog title="用�报告" :visible.sync="drugReportDialogVisible" width="80%" :before-close="handleCloseR" append-to-body >
@@ -233,18 +233,18 @@
         <el-descriptions-item label="订�编�"><span v-if="drugReportItem!=null">{{drugReportItem.orderCode}}</span></el-descriptions-item>
         <el-descriptions-item label="病人�称"><span v-if="drugReportItem!=null">{{drugReportItem.patientName}}</span></el-descriptions-item>
         <el-descriptions-item label="医生�称"><span v-if="drugReportItem!=null">{{drugReportItem.doctorNane}}</span></el-descriptions-item>
-        <el-descriptions-item label="状�><span v-if="drugReportItem!=null"> <dict-tag :options="statusDrugReportOptions" :value="drugReportItem.status"/></span></el-descriptions-item>
+        <el-descriptions-item label="状�"><span v-if="drugReportItem!=null"> <dict-tag :options="statusDrugReportOptions" :value="drugReportItem.status"/></span></el-descriptions-item>
         <el-descriptions-item label="咨询总结"><span v-if="drugReportItem!=null">{{drugReportItem.reportSummary}}</span></el-descriptions-item>
         <el-descriptions-item label="生活建议"span="3"><span v-if="drugReportItem!=null">{{drugReportItem.reportAdvice}}</span></el-descriptions-item>
         <el-descriptions-item label="备注"span="3"><span v-if="drugReportItem!=null">{{drugReportItem.remark}}</span></el-descriptions-item>
-        <el-descriptions-item label="评分"span="3"><span v-if="drugReportItem!=null"><span v-safe-html="drugReportItem.pingStar"></span></span></el-descriptions-item>
-        <el-descriptions-item label="评价" span="3"><span v-if="drugReportItem!=null"> <span v-safe-html="drugReportItem.pingContent"></span></span></el-descriptions-item>
-        <el-descriptions-item label="评价时间" span="3"><span v-if="drugReportItem!=null"> <span v-safe-html="drugReportItem.pingTime"></span></span></el-descriptions-item>
-        <el-descriptions-item label="创建时间" span="3"><span v-if="drugReportItem!=null"> <span v-safe-html="drugReportItem.createTime"></span></span></el-descriptions-item>
+        <el-descriptions-item label="评分"span="3"><span v-if="drugReportItem!=null"><span v-html="drugReportItem.pingStar"></span></span></el-descriptions-item>
+        <el-descriptions-item label="评价" span="3"><span v-if="drugReportItem!=null"> <span v-html="drugReportItem.pingContent"></span></span></el-descriptions-item>
+        <el-descriptions-item label="评价时间" span="3"><span v-if="drugReportItem!=null"> <span v-html="drugReportItem.pingTime"></span></span></el-descriptions-item>
+        <el-descriptions-item label="创建时间" span="3"><span v-if="drugReportItem!=null"> <span v-html="drugReportItem.createTime"></span></span></el-descriptions-item>
       </el-descriptions>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="drugReportDialogVisible = false">��/el-button>
-        <el-button type="primary" @click="drugReportDialogVisible = false">ç¡?å®?/el-button>
+        <el-button @click="drugReportDialogVisible = false">� 消</el-button>
+        <el-button type="primary" @click="drugReportDialogVisible = false">确 定</el-button>
       </span>
     </el-dialog>
 
@@ -276,7 +276,7 @@ export default {
       drugReportDialogVisible:false,
       prescribeDialog:{
         open:false,
-        title:"处方�
+        title:"处方�"
       },
       msgForm:{
         pageNum: 1,

+ 4 - 4
src/views/components/his/integralGoodsDetails.vue

@@ -7,7 +7,7 @@
         <div class="desct"> 积分商�信�</div>
         <el-descriptions title="" :column="3" border>
           <el-descriptions-item label="商��称"><span v-if="item!=null">{{item.goodsName}}</span></el-descriptions-item>
-          <el-descriptions-item label="���> <el-image v-if="item.imgUrl!=null"
+          <el-descriptions-item label="��图"> <el-image v-if="item.imgUrl!=null"
                   style="width: 100px"
                   :src="item.imgUrl"
                   :preview-src-list="[item.imgUrl]">
@@ -20,13 +20,13 @@
           <el-descriptions-item label="需支付金�"><span v-if="item!=null">{{item.cash}}</span></el-descriptions-item>
           <el-descriptions-item label="排�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
           <el-descriptions-item label="库存"><span v-if="item!=null">{{item.stock}}</span></el-descriptions-item>
-          <el-descriptions-item label="状�><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="状�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="创建时间"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
         </el-descriptions>
     </div>
     <div class="contentx" v-if="item!=null">
         <div class="desct"> 积分商�信�</div>
-    <span v-safe-html="item.descs"></span>
+    <span v-html="item.descs"></span>
     </div>
 
     </div>
@@ -40,7 +40,7 @@ import { listIntegralGoods, getIntegralGoods, delIntegralGoods, addIntegralGoods
       return {
         // 商�分类字典
         goodsTypeOptions: [],
-        // 状�字�
+        // 状�字典
         statusOptions: [],
         item:null,
       }

+ 2 - 2
src/views/components/his/medicatedFoodDetails.vue

@@ -19,9 +19,9 @@
           <el-descriptions-item label="椋熸潗"><span v-if="item!=null">{{item.food}}</span></el-descriptions-item>
 
           <el-descriptions-item label="鍒涘缓鏃堕棿"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
-          <el-descriptions-item label="鐘舵€?><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="鐘舵€�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="涓绘不鐤剧梾" span="3"><span v-if="item!=null" >{{item.indications}}</span></el-descriptions-item>
-          <el-descriptions-item label="鎻忚堪" span="3"><span v-if="item!=null" > <span v-safe-html="item.descs"></span></span></el-descriptions-item>
+          <el-descriptions-item label="鎻忚堪" span="3"><span v-if="item!=null" > <span v-html="item.descs"></span></span></el-descriptions-item>
         </el-descriptions>
     </div>
 

+ 35 - 35
src/views/components/his/msgDetails.vue

@@ -18,7 +18,7 @@
           <div v-if="lt.msgContentType == '4'" :class="{ 'right': lt.msgType == '2'}">
             <video  :src="lt.content" controls style="max-width: 400px; max-height: 400px;"></video>
           </div>
-          <span v-if="lt.msgContentType == '5'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="getPrescribe(JSON.parse(lt.content).prescribeId)">处方�/el-link></span>
+          <span v-if="lt.msgContentType == '5'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="getPrescribe(JSON.parse(lt.content).prescribeId)">处方�</el-link></span>
           <span v-if="lt.msgContentType == '6'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="report(lt.content)">问诊报告</el-link></span>
           <span v-if="lt.msgContentType == '7'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="follow(lt.content)">�访</el-link></span>
           <span v-if="lt.msgContentType == '8'" :class="{ 'right': lt.msgType == '2'}"><el-link type="primary" :underline="false" @click="drugReport(lt.content)">用�报告</el-link></span>
@@ -41,7 +41,7 @@
       @pagination="msgList"
     />
     <el-dialog
-      title="�访�
+      title="�访�"
       :visible.sync="followDialogVisible"
       width="80%"
       :before-close="handleCloseSF" append-to-body >
@@ -75,31 +75,31 @@
               </div>
 
       <span slot="footer" class="dialog-footer">
-        <el-button @click="followDialogVisible = false">��/el-button>
-        <el-button type="primary" @click="followDialogVisible = false">ç¡?å®?/el-button>
+        <el-button @click="followDialogVisible = false">� 消</el-button>
+        <el-button type="primary" @click="followDialogVisible = false">确 定</el-button>
       </span>
     </el-dialog>
-    <el-dialog title="处方� :visible.sync="prescribeDialog.open" width="80%" :before-close="handleClose" append-to-body >
+    <el-dialog title="处方�" :visible.sync="prescribeDialog.open" width="80%" :before-close="handleClose" append-to-body >
       <div class="desct">
         基本信�
       </div>
       <el-descriptions :column="3" border  >
-        <el-descriptions-item label="处方�编�  >
+        <el-descriptions-item label="处方�编�"  >
             <span v-if="prescribeItem!=null">
               {{prescribeItem.prescribeCode}}
             </span>
         </el-descriptions-item>
         <el-descriptions-item label="病情�述"  > <span v-if="prescribeItem!=null">{{prescribeItem.patientDescs}}</span></el-descriptions-item>
         <el-descriptions-item label="诊断"  > <span v-if="prescribeItem!=null">{{prescribeItem.diagnose}}</span></el-descriptions-item>
-        <el-descriptions-item label="既往� ><span v-if="prescribeItem!=null">{{prescribeItem.historyIllness}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者年� > <span v-if="prescribeItem!=null">{{prescribeItem.patientAge}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者姓� > <span v-if="prescribeItem!=null">{{prescribeItem.patientName}}</span> </el-descriptions-item>
+        <el-descriptions-item label="既往�" ><span v-if="prescribeItem!=null">{{prescribeItem.historyIllness}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者年龄" > <span v-if="prescribeItem!=null">{{prescribeItem.patientAge}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者姓�" > <span v-if="prescribeItem!=null">{{prescribeItem.patientName}}</span> </el-descriptions-item>
         <el-descriptions-item label="是�有过��" > <dict-tag :options="orOptions" :value="prescribeItem.historyAllergic"/></el-descriptions-item>
-        <el-descriptions-item label="过�� ><span v-if="prescribeItem!=null">{{prescribeItem.weight}}</span></el-descriptions-item>
-        <el-descriptions-item label="�功能是�异� ><span v-if="prescribeItem!=null">{{prescribeItem.liverUnusual}}</span> </el-descriptions-item>
-        <el-descriptions-item label="肾功能是�异� > <span v-if="prescribeItem!=null">{{prescribeItem.renalUnusual}}</span> </el-descriptions-item>
-        <el-descriptions-item label="是�是备�怀�哺乳� > <dict-tag :options="orOptions" :value="prescribeItem.isLactation"/> </el-descriptions-item>
-        <el-descriptions-item label="患者电� >  <span v-if="prescribeItem!=null">{{prescribeItem.patientTel}}</span> </el-descriptions-item>
+        <el-descriptions-item label="过��" ><span v-if="prescribeItem!=null">{{prescribeItem.weight}}</span></el-descriptions-item>
+        <el-descriptions-item label="�功能是�异常" ><span v-if="prescribeItem!=null">{{prescribeItem.liverUnusual}}</span> </el-descriptions-item>
+        <el-descriptions-item label="肾功能是�异常" > <span v-if="prescribeItem!=null">{{prescribeItem.renalUnusual}}</span> </el-descriptions-item>
+        <el-descriptions-item label="是�是备孕/怀孕/哺乳期" > <dict-tag :options="orOptions" :value="prescribeItem.isLactation"/> </el-descriptions-item>
+        <el-descriptions-item label="患者电�" >  <span v-if="prescribeItem!=null">{{prescribeItem.patientTel}}</span> </el-descriptions-item>
         <el-descriptions-item label="�师�称" > <span v-if="prescribeItem!=null">{{prescribeItem.doctorDrugName}}</span>  </el-descriptions-item>
         <el-descriptions-item label="医生�称" > <span v-if="prescribeItem!=null">{{prescribeItem.doctorName}}</span> </el-descriptions-item>
         <el-descriptions-item label="审核时间" > <span v-if="prescribeItem!=null">{{prescribeItem.auditTime}}</span></el-descriptions-item>
@@ -141,12 +141,12 @@
       </el-table>
       <div style="height: 30px;">
         <div style="float: right;margin: 20px" v-if="prescribeItem.prescribeType==2">
-          剂数�span class="color-danger">{{JSON.parse(prescribeItem.usageJson).counts}}</span>
+          剂数:<span class="color-danger">{{JSON.parse(prescribeItem.usageJson).counts}}</span>
         </div>
       </div>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="prescribeDialog.open = false">��/el-button>
-        <el-button type="primary" @click="prescribeDialog.open = false">ç¡?å®?/el-button>
+        <el-button @click="prescribeDialog.open = false">� 消</el-button>
+        <el-button type="primary" @click="prescribeDialog.open = false">确 定</el-button>
       </span>
     </el-dialog>
 
@@ -156,15 +156,15 @@
       </div>
       <el-descriptions :column="3" border  >
         <el-descriptions-item label="报告编�"><span v-if="reportItem!=null">{{reportItem.reportSn}}</span></el-descriptions-item>
-        <el-descriptions-item label="状�><span v-if="reportItem!=null"><dict-tag :options="statusOptions" :value="reportItem.status"/></span></el-descriptions-item>
+        <el-descriptions-item label="状�"><span v-if="reportItem!=null"><dict-tag :options="statusOptions" :value="reportItem.status"/></span></el-descriptions-item>
         <el-descriptions-item label="会员昵称"><span v-if="reportItem!=null">{{reportItem.nickName}}</span></el-descriptions-item>
         <el-descriptions-item label="会员电�"><span v-if="reportItem!=null">{{reportItem.phone}}</span></el-descriptions-item>
         <el-descriptions-item label="医生�称"><span v-if="reportItem!=null">{{reportItem.doctorName}}</span></el-descriptions-item>
-        <el-descriptions-item label="问诊�类� ><dict-tag :options="inquirySubTypeOptions" :value="reportItem.inquirySubType"/></el-descriptions-item>
+        <el-descriptions-item label="问诊�类型" ><dict-tag :options="inquirySubTypeOptions" :value="reportItem.inquirySubType"/></el-descriptions-item>
         <el-descriptions-item label="优惠劵��人"><span v-if="reportItem!=null">{{reportItem.sendName}}</span></el-descriptions-item>
         <el-descriptions-item label="主诉"><span v-if="reportItem!=null">{{reportItem.patientDescs}}</span></el-descriptions-item>
-        <el-descriptions-item label="疾病�><span v-if="reportItem!=null">{{reportItem.illnessLogs}}</span></el-descriptions-item>
-        <el-descriptions-item label="用��><span v-if="reportItem!=null">{{reportItem.drugLogs}}</span></el-descriptions-item>
+        <el-descriptions-item label="疾病历"><span v-if="reportItem!=null">{{reportItem.illnessLogs}}</span></el-descriptions-item>
+        <el-descriptions-item label="用��"><span v-if="reportItem!=null">{{reportItem.drugLogs}}</span></el-descriptions-item>
         <el-descriptions-item label="诊断结果"><span v-if="reportItem!=null">{{reportItem.inquiryResult}}</span></el-descriptions-item>
         <el-descriptions-item label="备注"><span v-if="reportItem!=null">{{reportItem.remark}}</span></el-descriptions-item>
         <el-descriptions-item label="医生签�"><span v-if="reportItem.signUrl!=null"><img :src="reportItem.signUrl" style="max-width: 100px;"></span></el-descriptions-item>
@@ -177,13 +177,13 @@
             {{ patientInfo }}
           </span>
           <span v-else>
-            患者信�
+            患者信�
           </span>
       </div>
       <el-descriptions :column="3" border  >
-       <el-descriptions-item label="患者姓� ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).patientName}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者年� ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).age}}</span></el-descriptions-item>
-        <el-descriptions-item label="患者性别" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).sex==1?'�:'�}}</span></el-descriptions-item>
+       <el-descriptions-item label="患者姓�" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).patientName}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者年龄" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).age}}</span></el-descriptions-item>
+        <el-descriptions-item label="患者性别" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).sex==1?'男':'女'}}</span></el-descriptions-item>
         <el-descriptions-item label="身份��" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).idCard}}</span></el-descriptions-item>
         <el-descriptions-item label="体�" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).weight}}</span></el-descriptions-item>
         <el-descriptions-item label="身高" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).height}}</span></el-descriptions-item>
@@ -226,8 +226,8 @@
             </el-descriptions>
       </div>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="reportDialogVisible = false">��/el-button>
-        <el-button type="primary" @click="reportDialogVisible = false">ç¡?å®?/el-button>
+        <el-button @click="reportDialogVisible = false">� 消</el-button>
+        <el-button type="primary" @click="reportDialogVisible = false">确 定</el-button>
       </span>
     </el-dialog>
     <el-dialog title="用�报告" :visible.sync="drugReportDialogVisible" width="80%" :before-close="handleCloseR" append-to-body >
@@ -238,18 +238,18 @@
         <el-descriptions-item label="订�编�"><span v-if="drugReportItem!=null">{{drugReportItem.orderCode}}</span></el-descriptions-item>
         <el-descriptions-item label="病人�称"><span v-if="drugReportItem!=null">{{drugReportItem.patientName}}</span></el-descriptions-item>
         <el-descriptions-item label="医生�称"><span v-if="drugReportItem!=null">{{drugReportItem.doctorNane}}</span></el-descriptions-item>
-        <el-descriptions-item label="状�><span v-if="drugReportItem!=null"> <dict-tag :options="statusDrugReportOptions" :value="drugReportItem.status"/></span></el-descriptions-item>
+        <el-descriptions-item label="状�"><span v-if="drugReportItem!=null"> <dict-tag :options="statusDrugReportOptions" :value="drugReportItem.status"/></span></el-descriptions-item>
         <el-descriptions-item label="咨询总结"><span v-if="drugReportItem!=null">{{drugReportItem.reportSummary}}</span></el-descriptions-item>
         <el-descriptions-item label="生活建议"span="3"><span v-if="drugReportItem!=null">{{drugReportItem.reportAdvice}}</span></el-descriptions-item>
         <el-descriptions-item label="备注"span="3"><span v-if="drugReportItem!=null">{{drugReportItem.remark}}</span></el-descriptions-item>
-        <el-descriptions-item label="评分"span="3"><span v-if="drugReportItem!=null"><span v-safe-html="drugReportItem.pingStar"></span></span></el-descriptions-item>
-        <el-descriptions-item label="评价" span="3"><span v-if="drugReportItem!=null"> <span v-safe-html="drugReportItem.pingContent"></span></span></el-descriptions-item>
-        <el-descriptions-item label="评价时间" span="3"><span v-if="drugReportItem!=null"> <span v-safe-html="drugReportItem.pingTime"></span></span></el-descriptions-item>
-        <el-descriptions-item label="创建时间" span="3"><span v-if="drugReportItem!=null"> <span v-safe-html="drugReportItem.createTime"></span></span></el-descriptions-item>
+        <el-descriptions-item label="评分"span="3"><span v-if="drugReportItem!=null"><span v-html="drugReportItem.pingStar"></span></span></el-descriptions-item>
+        <el-descriptions-item label="评价" span="3"><span v-if="drugReportItem!=null"> <span v-html="drugReportItem.pingContent"></span></span></el-descriptions-item>
+        <el-descriptions-item label="评价时间" span="3"><span v-if="drugReportItem!=null"> <span v-html="drugReportItem.pingTime"></span></span></el-descriptions-item>
+        <el-descriptions-item label="创建时间" span="3"><span v-if="drugReportItem!=null"> <span v-html="drugReportItem.createTime"></span></span></el-descriptions-item>
       </el-descriptions>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="drugReportDialogVisible = false">��/el-button>
-        <el-button type="primary" @click="drugReportDialogVisible = false">ç¡?å®?/el-button>
+        <el-button @click="drugReportDialogVisible = false">� 消</el-button>
+        <el-button type="primary" @click="drugReportDialogVisible = false">确 定</el-button>
       </span>
     </el-dialog>
 
@@ -283,7 +283,7 @@ import {getPrescribe,getDrugInfo} from "@/api/his/prescribe";
         drugReportDialogVisible:false,
         prescribeDialog:{
           open:false,
-          title:"处方�
+          title:"处方�"
         },
         msgForm:{
           pageNum: 1,

+ 12 - 12
src/views/components/his/packageDetails.vue

@@ -2,33 +2,33 @@
 
   <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
     <div style="padding: 20px; background-color: #fff;">
-      套�包详�
+      套é¤�包详æƒ
     </div>
 
 <div class="content" v-if="item!=null">
     <div class="desct">
-      套�包信�
+      套�包信�
     </div>
     <el-descriptions title="" :column="3" border>
-    <el-descriptions-item label="套�包�� >
+    <el-descriptions-item label="套�包�称" >
         <span v-if="item!=null">{{item.packageName}}</span>
     </el-descriptions-item>
-    <el-descriptions-item label="状� >
+    <el-descriptions-item label="状�" >
          <dict-tag :options="statusOptions" :value="item.status"/>
     </el-descriptions-item>
     <el-descriptions-item label="类型" >
          <dict-tag :options="packageTypeOptions" :value="item.packageType"/>
     </el-descriptions-item>
-    <el-descriptions-item label="�类� >
+    <el-descriptions-item label="�类型" >
          <dict-tag :options="packageSubTypeOptions" :value="item.packageSubType"/>
     </el-descriptions-item>
     <el-descriptions-item label="疾病类型" >
          <dict-tag :options="diseaseTypeOptions" :value="item.diseaseType"/>
     </el-descriptions-item>
-    <el-descriptions-item label="总价 �� >
+    <el-descriptions-item label="总价 元/天" >
          <span v-if="item!=null">{{item.price}}</span>
     </el-descriptions-item>
-    <el-descriptions-item label="套�� >
+    <el-descriptions-item label="套�价" >
          <span v-if="item!=null">{{item.totalPrice}}</span>
     </el-descriptions-item>
     <el-descriptions-item label="周期" >
@@ -54,7 +54,7 @@
     <el-descriptions-item label="修改时间" >
         <span v-if="item!=null">{{item.updateTime}}</span>
     </el-descriptions-item>
-    <el-descriptions-item label="��� >
+    <el-descriptions-item label="��图" >
         <el-image v-for="img in item.imgUrl" :key="img"
             style="width: 100px"
             :src="img"
@@ -91,7 +91,7 @@
                 <el-table-column label="商��称" show-overflow-tooltip align="center" prop="productName" />
                 <el-table-column label="数�" align="center"  prop="count" width="150px" />
                 <el-table-column label="�用方法" align="center"  prop="usageMethod" width="150px" />
-                <el-table-column label="一日几� align="center"  prop="usageFrequencyUnit" width="150px" />
+                <el-table-column label="一日几次" align="center"  prop="usageFrequencyUnit" width="150px" />
                 <el-table-column label="商�编�" align="center" prop="barCode" />
                 <el-table-column label="商�规格" align="center" prop="sku" />
                 <el-table-column label="售价" align="center"  prop="price"  >
@@ -118,7 +118,7 @@
 <div class="desct">
   套�详情
 </div>
-<span v-safe-html="item.desc"></span>
+<span v-html="item.desc"></span>
  </div>
       </div>
 </template>
@@ -131,7 +131,7 @@ import {list as getAppMallOptions} from '@/api/course/coursePlaySourceConfig';
     props:["data"],
     data() {
       return {
-       // 状�字�
+       // 状�字典
        drugList:[],
        drugOpen:false,
        statusOptions: [],
@@ -153,7 +153,7 @@ import {list as getAppMallOptions} from '@/api/course/coursePlaySourceConfig';
         const ids = this.item.appIds.split(',');
         return ids
           .map(id => this.appMallOptions.find(opt => opt.appid === id)?.name)
-          .filter(Boolean); // 过滤掉找�到�
+          .filter(Boolean); // 过滤掉找ä¸�到çš
       }
     },
     created() {

+ 1 - 1
src/views/components/his/storeOrderDetails.vue

@@ -548,8 +548,8 @@ import {getCitys} from "@/api/store/city";
         },
 		    sourceOptions:[],
         prescribeDialog:{
-          title:"处方单",
           open:false,
+          title:"处方",
         },
         followDialogVisible:false,
         dialogVisible:false,

+ 1 - 1
src/views/components/his/storeOrderDetails2.vue

@@ -441,8 +441,8 @@ import { getTcmScheduleList } from "@/api/company/schedule";
           open:false,
         },
         prescribeDialog:{
-          title:"处方单",
           open:false,
+          title:"处方",
         },
         followDialogVisible:false,
         dialogVisible:false,

+ 10 - 10
src/views/components/his/storeProductDetails.vue

@@ -28,7 +28,7 @@
                 <span v-if="item!=null">{{item.productIntroduce}}</span>
 
             </el-descriptions-item>
-            <el-descriptions-item label="关键� >
+            <el-descriptions-item label="关键字" >
                 <span v-if="item!=null">{{item.keyword}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="产���" >
@@ -40,20 +40,20 @@
             <el-descriptions-item label="商�价格" >
                 <span v-if="item!=null">{{item.price}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="市场� >
+            <el-descriptions-item label="市场价" >
                 <span v-if="item!=null">{{item.otPrice}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="���  >
+            <el-descriptions-item label="���"  >
                 <span v-if="item!=null">{{item.unitName}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="排�" >
                 <span v-if="item!=null">{{item.sort}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="销� >
+            <el-descriptions-item label="销�" >
                 <span v-if="item!=null">{{item.stock}}</span>
             </el-descriptions-item>
 
-            <el-descriptions-item label="状� >
+            <el-descriptions-item label="状�" >
 
                    <dict-tag :options="specShowOptions" :value="item.isShow"/>
             </el-descriptions-item>
@@ -76,16 +76,16 @@
             <el-descriptions-item label="是�包邮" >
                <dict-tag :options="orOptions" :value="item.isPostage"/>
             </el-descriptions-item>
-            <el-descriptions-item label="是�在商�展� >
+            <el-descriptions-item label="是�在商�展示" >
                <dict-tag :options="orOptions" :value="item.isDisplay"/>
             </el-descriptions-item>
             <el-descriptions-item label="获得积分" >
                 <span v-if="item!=null">{{item.giveIntegral}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="�本�  >
+            <el-descriptions-item label="�本价"  >
                 <span v-if="item!=null">{{item.costPrice}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="�览� >
+            <el-descriptions-item label="�览�" >
                 <span v-if="item!=null">{{item.views}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="产�二维�地�" >
@@ -103,7 +103,7 @@
             <el-descriptions-item label="生产厂家" >
                 <span v-if="item!=null">{{item.prescribeFactory}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="处方� >
+            <el-descriptions-item label="处方�" >
                 <span v-if="item!=null">{{item.prescribeName}}</span>
             </el-descriptions-item>
 
@@ -126,7 +126,7 @@
       <div class="desct">
         ���述
       </div>
-        <span v-safe-html="item.desc"></span>
+        <span v-html="item.desc"></span>
      <!-- <el-descriptions  direction="vertical" :column="1" border >
          <el-descriptions-item label="���述" >
 

+ 4 - 4
src/views/components/his/vesselDetails.vue

@@ -13,14 +13,14 @@
                     :preview-src-list="[item.imgUrl]">
             </el-image>
           </el-descriptions-item>
-          <el-descriptions-item label="霂瑁��亦�蝏𦦵庖雿滚�蝘?><span v-if="item!=null">{{item.vesselName}}</span></el-descriptions-item>
+          <el-descriptions-item label="霂瑁��亦�蝏𦦵庖雿滚�蝘�"><span v-if="item!=null">{{item.vesselName}}</span></el-descriptions-item>
           <el-descriptions-item label="�鍦�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
            <el-descriptions-item label="蝏讐�"><span v-if="item!=null">{{item.vessel}}</span></el-descriptions-item>
           <el-descriptions-item label="�其�"><span v-if="item!=null">{{item.region}}</span></el-descriptions-item>
 
-          <el-descriptions-item label="�嗆�?><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="�嗆��"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="�𥕦遣�園𡢿"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
-          <el-descriptions-item label="�讛膩"><span  v-if="item!=null" v-safe-html="item.descs" ></span></el-descriptions-item>
+          <el-descriptions-item label="�讛膩"><span  v-if="item!=null" v-html="item.descs" ></span></el-descriptions-item>
         </el-descriptions>
     </div>
 
@@ -35,7 +35,7 @@ import { listVessel, getVessel, delVessel, addVessel, updateVessel, exportVessel
     data() {
       return {
         item:null,
-        // �嗆����?
+        // �嗆����
         statusOptions: [],
       }
     },

+ 25 - 6
src/views/course/courseFinishTemp/index.vue

@@ -239,10 +239,16 @@
               <el-col :span="22">
                 <el-form :model="item" label-width="70px">
                   <el-form-item label="内容类别" style="margin: 2%">
-                    <el-radio-group v-model="item.contentType">
-                      <el-radio :label="item.dictValue" v-for="item in sysQwSopAiContentType">{{ item.dictLabel }}
+                    <el-radio-group v-model="item.contentType" :disabled="isSopVoiceLocked(item.contentType)">
+                      <el-radio
+                        v-for="dict in sysQwSopAiContentType"
+                        v-if="showSopContentTypeOption(dict.dictValue, item.contentType)"
+                        :key="dict.dictValue"
+                        :label="dict.dictValue"
+                        :disabled="isSopVoiceType(dict.dictValue) && !sopVoiceEnabled">{{ dict.dictLabel }}
                       </el-radio>
                     </el-radio-group>
+                    <div v-if="isSopVoiceLocked(item.contentType)" style="margin: 0 2% 8px;color:#909399;font-size:12px;">语音/APP语音已停用,仅可删除该内容,不可修改</div>
                   </el-form-item>
                   <el-form-item label="内容" style="margin-bottom: 2%">
                     <el-input v-if="item.contentType == 1 " v-model="item.value" type="textarea" :rows="3"
@@ -310,8 +316,9 @@
                         </video>
                       </el-form-item>
                     </div>
-                    <div v-if="item.contentType == 7 ">
+                    <div v-if="item.contentType == 7 || item.contentType == 16">
                       <el-input
+                        :disabled="isSopVoiceLocked(item.contentType)"
                         v-model="item.value"
                         type="textarea" :rows="3" maxlength="66" show-word-limit
                         placeholder="输入要转为语音的内容" style="width: 90%;margin-top: 10px;"
@@ -341,10 +348,16 @@
               <el-col :span="22">
                 <el-form :model="item" label-width="70px">
                   <el-form-item label="内容类别" style="margin: 2%">
-                    <el-radio-group v-model="item.contentType">
-                      <el-radio :label="item.dictValue" v-for="item in sysQwSopAiContentType">{{ item.dictLabel }}
+                    <el-radio-group v-model="item.contentType" :disabled="isSopVoiceLocked(item.contentType)">
+                      <el-radio
+                        v-for="dict in sysQwSopAiContentType"
+                        v-if="showSopContentTypeOption(dict.dictValue, item.contentType)"
+                        :key="dict.dictValue"
+                        :label="dict.dictValue"
+                        :disabled="isSopVoiceType(dict.dictValue) && !sopVoiceEnabled">{{ dict.dictLabel }}
                       </el-radio>
                     </el-radio-group>
+                    <div v-if="isSopVoiceLocked(item.contentType)" style="margin: 0 2% 8px;color:#909399;font-size:12px;">语音/APP语音已停用,仅可删除该内容,不可修改</div>
                   </el-form-item>
                   <el-form-item label="内容" style="margin-bottom: 2%">
                     <el-input v-if="item.contentType == 1 " v-model="item.value" type="textarea" :rows="3"
@@ -412,8 +425,9 @@
                         </video>
                       </el-form-item>
                     </div>
-                    <div v-if="item.contentType == 7 ">
+                    <div v-if="item.contentType == 7 || item.contentType == 16">
                       <el-input
+                        :disabled="isSopVoiceLocked(item.contentType)"
                         v-model="item.value"
                         type="textarea" :rows="3" maxlength="66" show-word-limit
                         placeholder="输入要转为语音的内容" style="width: 90%;margin-top: 10px;"
@@ -482,6 +496,7 @@ import ImageUpload from "@/views/qw/sop/ImageUpload.vue";
 import { getCompanyList } from "@/api/company/company";
 import SelectTree from '@/components/TreeSelect/index.vue'
 import { getDeptData } from '@/api/system/employeeStats'
+import { isSopVoiceEnabled, isSopVoiceLocked, isSopVoiceType, showSopContentTypeOption } from "@/utils/sopVoice";
 
 export default {
   name: "CourseFinishTemp",
@@ -523,6 +538,7 @@ export default {
       courseFinishTempList: [],
       //插件版
       sysQwSopAiContentType: [],
+      sopVoiceEnabled: isSopVoiceEnabled(),
 
       sysFsSopWatchStatus: [],
 
@@ -590,6 +606,9 @@ export default {
     this.getList();
   },
   methods: {
+    isSopVoiceLocked,
+    isSopVoiceType,
+    showSopContentTypeOption,
     courseChange() {
 
       videoList(this.form.courseId).then(response => {

+ 25 - 6
src/views/course/courseFinishTempParent/index.vue

@@ -167,10 +167,16 @@
               <el-col :span="22">
                 <el-form :model="item" label-width="70px">
                   <el-form-item label="内容类别" style="margin: 2%">
-                    <el-radio-group v-model="item.contentType">
-                      <el-radio :label="item.dictValue" v-for="item in sysQwSopAiContentType">{{ item.dictLabel }}
+                    <el-radio-group v-model="item.contentType" :disabled="isSopVoiceLocked(item.contentType)">
+                      <el-radio
+                        v-for="dict in sysQwSopAiContentType"
+                        v-if="showSopContentTypeOption(dict.dictValue, item.contentType)"
+                        :key="dict.dictValue"
+                        :label="dict.dictValue"
+                        :disabled="isSopVoiceType(dict.dictValue) && !sopVoiceEnabled">{{ dict.dictLabel }}
                       </el-radio>
                     </el-radio-group>
+                    <div v-if="isSopVoiceLocked(item.contentType)" style="margin: 0 2% 8px;color:#909399;font-size:12px;">语音/APP语音已停用,仅可删除该内容,不可修改</div>
                   </el-form-item>
                   <el-form-item label="内容" style="margin-bottom: 2%">
                     <el-input v-if="item.contentType == 1 " v-model="item.value" type="textarea" :rows="3"
@@ -238,8 +244,9 @@
                         </video>
                       </el-form-item>
                     </div>
-                    <div v-if="item.contentType == 7 ">
+                    <div v-if="item.contentType == 7 || item.contentType == 16">
                       <el-input
+                        :disabled="isSopVoiceLocked(item.contentType)"
                         v-model="item.value"
                         type="textarea" :rows="3" maxlength="66" show-word-limit
                         placeholder="输入要转为语音的内容" style="width: 90%;margin-top: 10px;"
@@ -269,10 +276,16 @@
               <el-col :span="22">
                 <el-form :model="item" label-width="70px">
                   <el-form-item label="内容类别" style="margin: 2%">
-                    <el-radio-group v-model="item.contentType">
-                      <el-radio :label="item.dictValue" v-for="item in sysQwSopAiContentType">{{ item.dictLabel }}
+                    <el-radio-group v-model="item.contentType" :disabled="isSopVoiceLocked(item.contentType)">
+                      <el-radio
+                        v-for="dict in sysQwSopAiContentType"
+                        v-if="showSopContentTypeOption(dict.dictValue, item.contentType)"
+                        :key="dict.dictValue"
+                        :label="dict.dictValue"
+                        :disabled="isSopVoiceType(dict.dictValue) && !sopVoiceEnabled">{{ dict.dictLabel }}
                       </el-radio>
                     </el-radio-group>
+                    <div v-if="isSopVoiceLocked(item.contentType)" style="margin: 0 2% 8px;color:#909399;font-size:12px;">语音/APP语音已停用,仅可删除该内容,不可修改</div>
                   </el-form-item>
                   <el-form-item label="内容" style="margin-bottom: 2%">
                     <el-input v-if="item.contentType == 1 " v-model="item.value" type="textarea" :rows="3"
@@ -340,8 +353,9 @@
                         </video>
                       </el-form-item>
                     </div>
-                    <div v-if="item.contentType == 7 ">
+                    <div v-if="item.contentType == 7 || item.contentType == 16">
                       <el-input
+                        :disabled="isSopVoiceLocked(item.contentType)"
                         v-model="item.value"
                         type="textarea" :rows="3" maxlength="66" show-word-limit
                         placeholder="输入要转为语音的内容" style="width: 90%;margin-top: 10px;"
@@ -401,6 +415,7 @@ import { listCourseFinishTempParent, getCourseFinishTempParent, delCourseFinishT
 import {courseList} from '@/api/qw/sop'
 import ImageUpload from '@/views/qw/sop/ImageUpload.vue'
 import { getUserList } from '@/api/company/companyUser'
+import { isSopVoiceEnabled, isSopVoiceLocked, isSopVoiceType, showSopContentTypeOption } from "@/utils/sopVoice";
 
 
 export default {
@@ -436,6 +451,7 @@ export default {
       allowSelect: [],
       sysFsSopWatchStatus: [],
       sysQwSopAiContentType: [],
+      sopVoiceEnabled: isSopVoiceEnabled(),
       // 弹出层标题
       title: "",
       // 是否显示弹出层
@@ -489,6 +505,9 @@ export default {
     this.getList();
   },
   methods: {
+    isSopVoiceLocked,
+    isSopVoiceType,
+    showSopContentTypeOption,
     /** 查询完课模板列表 */
     getList() {
       this.loading = true;

+ 38 - 259
src/views/course/courseQuestionBank/index.vue

@@ -4,7 +4,7 @@
       <el-form-item label="问题" prop="title">
         <el-input
           v-model="queryParams.title"
-          placeholder="请输入问题标�
+          placeholder="请输入问题标题"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -13,7 +13,7 @@
 <!--      <el-form-item label="排�" prop="sort">-->
 <!--        <el-input-->
 <!--          v-model="queryParams.sort"-->
-<!--          placeholder="请输入排�-->
+<!--          placeholder="请输入排�"-->
 <!--          clearable-->
 <!--          size="small"-->
 <!--          @keyup.enter.native="handleQuery"-->
@@ -29,30 +29,8 @@
           />
         </el-select>
       </el-form-item>
-	  <el-form-item label="题目类别" prop="questionType">
-	    <el-select v-model="queryParams.questionType" ref="typeSelect" placeholder="请选择类别" @change="changeCateType" clearable size="small">
-	      <el-option
-          v-for="item in questionRootTypeOptions"
-          :key="item.dictValue"
-          :label="item.dictLabel"
-          :value="item.dictValue"
-          />
-	    </el-select>
-	  </el-form-item>
-    <el-form-item label="题目�类� prop="questionSubType" label-width="100px">
-      <el-select v-model="queryParams.questionSubType" ref="typeSelect" placeholder="请选择�类� clearable size="small">
-        <el-option
-          v-for="item in questionSubTypeOptions"
-          :key="item.dictValue"
-          :label="item.dictLabel"
-          :value="item.dictValue"
-        />
-      </el-select>
-    </el-form-item>
-
-
-<!--      <el-form-item label="状� prop="status">-->
-<!--        <el-select v-model="queryParams.status" placeholder="请选择状� clearable size="small">-->
+<!--      <el-form-item label="状�" prop="status">-->
+<!--        <el-select v-model="queryParams.status" placeholder="请选择状�" clearable size="small">-->
 <!--          <el-option-->
 <!--            v-for="dict in statusOptions"-->
 <!--            :key="dict.dictValue"-->
@@ -111,16 +89,6 @@
           v-hasPermi="['course:courseQuestionBank:export']"
         >导出</el-button>
       </el-col>
-      <el-col :span="1.5">
-        <el-button
-          plain
-          type="info"
-          icon="el-icon-upload2"
-          size="mini"
-          @click="handleImport"
-          v-hasPermi="['course:courseQuestionBank:importData']"
-        >导入</el-button>
-      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -132,17 +100,7 @@
           <dict-tag :options="typeOptions" :value="scope.row.type"/>
         </template>
       </el-table-column>
-	  <el-table-column label="题目类别" align="center" prop="questionType">
-	    <template slot-scope="scope">
-        <el-tag v-if="scope.row.questionType">{{ getCategoryName(scope.row.questionType) }}</el-tag>
-	    </template>
-	  </el-table-column>
-    <el-table-column label="题目�类� align="center" prop="questionType">
-      <template slot-scope="scope">
-        <el-tag v-if="scope.row.questionSubType">{{ getCategoryName(scope.row.questionSubType) }}</el-tag>
-      </template>
-    </el-table-column>
-      <el-table-column label="状� align="center" prop="status">
+      <el-table-column label="状�" align="center" prop="status">
         <template slot-scope="scope">
           <dict-tag :options="statusOptions" :value="scope.row.status"/>
         </template>
@@ -181,13 +139,13 @@
     <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="标题" prop="title">
-          <el-input v-model="form.title" placeholder="请输入问� />
+          <el-input v-model="form.title" placeholder="请输入问题" />
         </el-form-item>
         <el-form-item label="排�" prop="sort">
-          <el-input-number v-model="form.sort"  :min="0" label="请输入排�></el-input-number>
+          <el-input-number v-model="form.sort"  :min="0" label="请输入排�"></el-input-number>
         </el-form-item>
-        <el-form-item label="类别 " prop="type">
-          <el-select v-model="form.type" placeholder="请选择类别" @change="changeType">
+        <el-form-item label="题目类别 " prop="type">
+          <el-select v-model="form.type" placeholder="请选择题目类别" @change="changeType">
             <el-option
               v-for="dict in typeOptions"
               :key="dict.dictValue"
@@ -196,25 +154,7 @@
             ></el-option>
           </el-select>
         </el-form-item>
-		<el-form-item label="题目类别 " prop="questionType">
-		  <el-select v-model="form.questionType" clearable placeholder="请选择题目类别" @change="changeCateType">
-        <el-option
-          v-for="item in questionRootTypeOptions"
-          :key="item.dictValue"
-          :label="item.dictLabel"
-          :value="item.dictValue"
-        />
-		  </el-select>
-      <el-select v-model="form.questionSubType" clearable placeholder="请选择题目�类� >
-        <el-option
-          v-for="item in questionSubTypeOptions"
-          :key="item.dictValue"
-          :label="item.dictLabel"
-          :value="item.dictValue"
-        />
-      </el-select>
-		</el-form-item>
-        <el-form-item label="状�>
+        <el-form-item label="状�">
           <el-radio-group v-model="form.status">
             <el-radio
               v-for="dict in statusOptions"
@@ -227,7 +167,6 @@
         <el-alert v-if="!form.type" title="选择题目类别�添加选项" type="warning" show-icon></el-alert>
 
         <el-form-item label="选项"  v-if="form.type">
-          <el-button @click="addRow" size="mini" type="primary">新增选项</el-button>
           <el-table border :data="question"  :cell-style="{ textAlign: 'center' }"		 :header-cell-style="{textAlign: 'center'}"   >
             <el-table-column label="��" width="65px" >
               <template slot-scope="scope">
@@ -236,10 +175,10 @@
             </el-table-column>
             <el-table-column label="选项" prop="name" >
               <template slot-scope="scope">
-                <el-input v-model="scope.row.name" :placeholder="getOptionLabel(scope.$index) + '� + '请输入标�" ></el-input>
+                <el-input v-model="scope.row.name" :placeholder="getOptionLabel(scope.$index) + ':' + '请输入标题'" ></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="是�为答� prop="isWrite" >
+            <el-table-column label="是�为答案" prop="isWrite" >
               <template slot-scope="scope">
                 <el-tooltip
                   v-if="!scope.row.name"
@@ -268,6 +207,7 @@
             <el-table-column label="�作">
               <template slot-scope="scope">
                 <el-button @click="deleteRow(scope.$index)"   size="mini" type="text" v-if="question.length>1">删除</el-button>
+                <el-button @click="addRow(scope.$index+1)" size="mini" type="text" >新增</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -281,63 +221,15 @@
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">ç¡?å®?/el-button>
-        <el-button @click="cancel">��/el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">� 消</el-button>
       </div>
     </el-dialog>
-
-    <!-- 导入 -->
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">
-          将文件拖到此处,�
-          <em>点击上传</em>
-        </div>
-        <div class="el-upload__tip" slot="tip">
-          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模�</el-link>
-        </div>
-        <div class="el-upload__tip" style="color:red" slot="tip">�示:仅�许导入“xls�或“xlsx�格�文件�</div>
-      </el-upload>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" :loading="upload.isUploading" :disabled="upload.isUploading" @click="submitFileForm">ç¡?å®?/el-button>
-        <el-button @click="upload.open = false">��/el-button>
-      </div>
-    </el-dialog>
-    <el-dialog title="导入结果" :close-on-press-escape="false" :close-on-click-modal="false" :visible.sync="importMsgOpen" width="500px" append-to-body>
-      <div class="import-msg" v-safe-html="importMsg">
-      </div>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="importMsgOpen = false">å…?é—?/el-button>
-        <el-button
-          v-if="failList && failList.length > 0"
-          type="primary"
-          @click="handleExportFailList(failList)"
-          :loading="exportFailLoading"
-        >导出失败信�</el-button>
-      </div>
-    </el-dialog>
-
   </div>
 </template>
 
 <script>
-import {
-  listCourseQuestionBank,
-  getCourseQuestionBank,
-  delCourseQuestionBank,
-  addCourseQuestionBank,
-  updateCourseQuestionBank,
-  exportCourseQuestionBank,
-  importTemplate,
-  exportFail
-} from "@/api/course/courseQuestionBank";
-import { getToken } from "@/utils/auth";
-import {
-  listUserCourseCategory,
-  getCatePidList,
-  getCateListByPid
-} from '@/api/course/userCourseCategory'
+import { listCourseQuestionBank, getCourseQuestionBank, delCourseQuestionBank, addCourseQuestionBank, updateCourseQuestionBank, exportCourseQuestionBank } from "@/api/course/courseQuestionBank";
 
 export default {
   name: "CourseQuestionBank",
@@ -352,42 +244,36 @@ export default {
   },
   data() {
     return {
-      exportFailLoading: false,
-      //��
+
+      //å�•é€
       selectedAnswer:null,
-      //多�
+      //多é€
       selectedAnswers: [],
 
       typeOptions: [],
       statusOptions: [],
       question:[
         { name: "", isAnswer: 0, indexId:0},
-        { name: "", isAnswer: 0, indexId:1},
-        { name: "", isAnswer: 0, indexId:2},
-        { name: "", isAnswer: 0, indexId:3},
       ],
-      // �罩�
+      // �罩层
       loading: true,
-      // 导出�罩�
+      // 导出é�®ç½©å±
       exportLoading: false,
       // 选中数组
       ids: [],
-      // ��个��
+      // ��个�用
       single: true,
-      // �多个��
+      // �多个�用
       multiple: true,
       // 显示�索�件
       showSearch: true,
-      // 总��
+      // 总�数
       total: 0,
       // 题库表格数�
       courseQuestionBankList: [],
-	  questionTypeOptions: [],
-      questionRootTypeOptions: [],
-	    questionSubTypeOptions: [],
-      // 弹出层标�
+      // 弹出层标题
       title: "",
-      // 是�显示弹出�
+      // 是�显示弹出层
       open: false,
       // 查询�数
       queryParams: {
@@ -398,8 +284,6 @@ export default {
         type: null,
         status: null,
         question: null,
-		    questionType:null,
-        questionSubType: null,
         answer: null,
       },
       // 表��数
@@ -412,22 +296,6 @@ export default {
         status: [{ required: true, message: "�能为空", trigger: "blur" }],
         question: [{ required: true, message: "�能为空", trigger: "blur" }],
         answer: [{ required: true, message: "�能为空", trigger: "blur" }],
-      },
-      // 导入
-      importMsgOpen:false,
-      failList:[],
-      importMsg: '',
-      upload: {
-        // 是�显示弹出层(文件导入�
-        open: false,
-        // 弹出层标题(文件导入�
-        title: "",
-        // 是��用上传
-        isUploading: false,
-        // 设置上传的请求头�
-        headers: { Authorization: "Bearer " + getToken() },
-        // 上传的地�
-        url: process.env.VUE_APP_BASE_API + "/course/courseQuestionBank/importData",
       }
     };
   },
@@ -439,68 +307,21 @@ export default {
     this.getDicts("sys_company_status").then(response => {
       this.statusOptions = response.data;
     });
-    this.getCategoryTree()
   },
   methods: {
     getOptionLabel(index) {
       return this.alphabet[index];
     },
-// 导出失败信�
-    handleExportFailList(failList) {
-      if (!failList || failList.length === 0) {
-        this.msgWarning("没有失败信��导�);
-        return;
-      }
 
 
-      this.exportFailLoading = true;
-      this.$confirm('是�确认导出失败信�?', "�示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "�消",
-        type: "info"
-      }).then(() => {
-        // 调用导出失败信�的API
-        exportFail(failList).then(response => {
-          this.download(response.msg);
-          this.msgSuccess("失败信�导出�功");
-          this.exportFailLoading = false;
-        }).catch(() => {
-          this.msgError("失败信�导出失败");
-          this.exportFailLoading = false;
-        });
-      }).catch(() => {
-        this.exportFailLoading = false;
-      });
-    },
-
-    // 分类�
-    getCategoryTree() {
-      listUserCourseCategory().then(response => {
-        this.questionTypeOptions = response.data
-      });
-      getCatePidList().then(response => {
-        this.questionRootTypeOptions = response.data
-      });
-    },
-    changeCateType(val) {
-      if (!val) {
-        return
-      }
-      getCateListByPid(val).then(response => {
-        this.questionSubTypeOptions = response.data
-      })
-    },
-    getCategoryName(id) {
-      return this.questionTypeOptions.find(item => item.cateId === id)?.cateName || '';
-    },
     //题目类型�生�化
     changeType(){
         this.selectedAnswers = [];
         this.selectedAnswer = null;
         this.question.forEach(item => {
-          item.isAnswer = 0; // 清除所有选项的选中状�
+          item.isAnswer = 0; // 清除所有选项的选中状�
         });
-        // �置答案的显示�
+        // �置答案的显示值
         this.form.answer = null;
     },
     //选择答案
@@ -518,25 +339,25 @@ export default {
         this.form.answer = row.name;
       } else if (this.form.type === 2) {
 
-        // 多选模�:将所有被选中的答案存储到 selectedAnswers 数组 先检查当�选项是�已�在选中答案列表�
+        // 多选模�:将所有被选中的答案存储到 selectedAnswers 数组 先检查当�选项是�已�在选中答案列表中
         if (row.isAnswer === 1) {
           // 如果选中,将该答案加入到选中数组
           this.selectedAnswers.push(row);
         } else {
-          // 如果�消选中,从选中数组中移�
+          // 如果�消选中,从选中数组中移除
           this.selectedAnswers = this.selectedAnswers.filter(item => item.indexId !== row.indexId);
         }
 
-        // �selectedAnswers 进行排� (�设�row.indexId 排�)
+        // 对 selectedAnswers 进行排� (�设按 row.indexId 排�)
         this.selectedAnswers.sort((a, b) => a.indexId - b.indexId);
 
-        // 更新 form.answer,�存所有选中的答�
+        // 更新 form.answer,�存所有选中的答案
         this.form.answer = this.selectedAnswers.map(item => item.name);
       }
 
     },
-    addRow() {
-      this.question.push({ name: '', isAnswer: 0,indexId: this.question.length});},
+    addRow(val) {
+      this.question.push({ name: '', isAnswer: 0,indexId:val});},
     deleteRow(index) {
       if (this.form.type === 1 && this.question[index] === this.selectedAnswer) {
         this.selectedAnswer = null;
@@ -556,7 +377,6 @@ export default {
     cancel() {
       this.open = false;
       this.reset();
-      this.changeCateType(this.queryParams.questionType)
     },
     // 表��置
     reset() {
@@ -572,12 +392,6 @@ export default {
         createBy: null
       };
       this.resetForm("form");
-      this.question = [
-        { name: "", isAnswer: 0, indexId:0},
-        { name: "", isAnswer: 0, indexId:1},
-        { name: "", isAnswer: 0, indexId:2},
-        { name: "", isAnswer: 0, indexId:3},
-      ]
     },
     /** �索按钮�作 */
     handleQuery() {
@@ -598,7 +412,6 @@ export default {
     /** 新增按钮�作 */
     handleAdd() {
       this.reset();
-      this.questionSubTypeOptions = []
       this.open = true;
       this.title = "添加题库";
     },
@@ -608,9 +421,9 @@ export default {
       const id = row.id || this.ids
       getCourseQuestionBank(id).then(response => {
         this.form = response.data;
-        this.changeCateType(this.form.questionType)
 
-        //�始化多选的选择结果,�选的选择的时候,就�消其他的�selectedAnswers
+
+        //�始化多选的选择结果,�选的选择的时候,就�消其他的了 selectedAnswers
         if (this.form.type===2) {
           this.form.answer=JSON.parse(this.form.answer)
           this.selectedAnswers = JSON.parse(this.form.question).filter(item => item.isAnswer === 1);
@@ -625,12 +438,6 @@ export default {
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-
-          if (this.question.some(q => q.name === "")) {
-            this.$message.error("�能存在空选项")
-            return
-          }
-
           this.form.question=JSON.stringify(this.question)
 
           if (this.form.type===2){
@@ -657,7 +464,7 @@ export default {
     /** 删除按钮�作 */
     handleDelete(row) {
       const ids = row.id || this.ids;
-      this.$confirm('是�确认删除题库编��' + ids + '"的数�项?', "警告", {
+      this.$confirm('是�确认删除题库编�为"' + ids + '"的数�项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "�消",
           type: "warning"
@@ -682,35 +489,7 @@ export default {
           this.download(response.msg);
           this.exportLoading = false;
         }).catch(() => {});
-    },
-    // 下载模�
-    importTemplate() {
-      importTemplate().then((response) => {
-        this.download(response.msg);
-      });
-    },
-    // 导入
-    handleImport() {
-      this.upload.title = "导入题目";
-      this.upload.open = true;
-    },
-    submitFileForm() {
-      this.$refs.upload.submit();
-    },
-    // 文件上传中处�
-    handleFileUploadProgress(event, file, fileList) {
-      this.upload.isUploading = true;
-    },
-    // 文件上传�功处�
-    handleFileSuccess(response, file, fileList) {
-      this.upload.open = false;
-      this.upload.isUploading = false;
-      this.$refs.upload.clearFiles();
-      this.importMsgOpen=true;
-      this.importMsg = response.data.message
-      this.failList = response.data.failList
-      this.getList();
-    },
+    }
   }
 };
 </script>

+ 64 - 31
src/views/course/sopLogs/sopLogsList.vue

@@ -4,7 +4,7 @@
       <el-form-item label="�微员工昵称" prop="qwUserName">
         <el-input
           v-model="queryParams.qwUserName"
-          placeholder="请输入�微员工昵�
+          placeholder="请输入�微员工昵称"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -13,14 +13,14 @@
       <el-form-item label="客户昵称" prop="externalUserName">
         <el-input
           v-model="queryParams.externalUserName"
-          placeholder="请输入�微客户昵�
+          placeholder="请输入�微客户昵称"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="���员)状� prop="sendStatus">
-        <el-select v-model="queryParams.sendStatus" placeholder="请选择���员)状� clearable size="small">
+      <el-form-item label="��(�员)状�" prop="sendStatus">
+        <el-select v-model="queryParams.sendStatus" placeholder="请选择��(�员)状�" clearable size="small">
           <el-option
             v-for="dict in sysQwSopLogsStatus"
             :key="dict.dictValue"
@@ -29,8 +29,8 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="接收(客户)状� prop="receivingStatus">
-        <el-select v-model="queryParams.receivingStatus" placeholder="请选择接收(客户)状� clearable size="small">
+      <el-form-item label="接收(客户)状�" prop="receivingStatus">
+        <el-select v-model="queryParams.receivingStatus" placeholder="请选择接收(客户)状�" clearable size="small">
           <el-option
             v-for="dict in groupMsgSendStatusOptions"
             :key="dict.dictValue"
@@ -58,6 +58,17 @@
           v-hasPermi="['course:sopLogs:export']"
         >导出</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['course:sopLogs:remove']"
+        >删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -65,11 +76,12 @@
       <el-tab-pane v-for="(item,index) in sysFsSopWatchStatus" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
     </el-tabs>
 
-    <el-table v-loading="loading" :data="qwSopLogsList">
+    <el-table v-loading="loading" :data="qwSopLogsList"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="�微�员昵称" align="center" prop="qwUserName" />
       <el-table-column label="系统��昵称" align="center" prop="userName" />
       <el-table-column label="客户昵称" align="center" prop="externalUserName" />
-      <el-table-column label="观看状� align="center" prop="watchStatus">
+      <el-table-column label="观看状�" align="center" prop="watchStatus">
         <template slot-scope="scope">
           <dict-tag :options="sysFsSopWatchStatus" :value="scope.row.watchStatus"/>
         </template>
@@ -81,12 +93,12 @@
           </el-button>
         </template>
       </el-table-column>
-      <el-table-column label="�员状� align="center" prop="sendStatus" >
+      <el-table-column label="�员状�" align="center" prop="sendStatus" >
         <template slot-scope="scope">
           <dict-tag :options="sysQwSopLogsStatus" :value="scope.row.sendStatus"/>
         </template>
       </el-table-column>
-      <el-table-column label="预计��时� align="center" prop="sendTime" width="180"/>
+      <el-table-column label="预计��时间" align="center" prop="sendTime" width="180"/>
       <el-table-column label="客户接收" align="center" prop="receivingStatus" >
         <template slot-scope="scope">
           <dict-tag :options="groupMsgSendStatusOptions" :value="scope.row.receivingStatus"/>
@@ -100,13 +112,14 @@
           <span>消�{{index}}:</span>
         </div>
         <div v-safe-html="item.value"></div>
+        <el-link v-if="item.isBindUrl == 1" :href="item.url" target="_blank">{{ item.url }}</el-link>
       </el-card>
       <span slot="footer" class="dialog-footer">
         <el-button @click="contentDialog.isDialogVisible = false">关闭</el-button>
       </span>
     </el-dialog>
 
-    <!-- 大图预览对��-->
+    <!-- 大图预览对è¯�æ¡-->
     <el-dialog
       :visible.sync="dialogVisible"
       :modal="false"
@@ -129,7 +142,7 @@
 </template>
 
 <script>
-import { listSopLogs } from '@/api/course/sopLogs'
+import { exportSopLogs, listSopLogsCVOList, delSopLogs } from '@/api/course/sopLogs'
 
 export default {
   name: "sopLogsList",
@@ -141,30 +154,30 @@ export default {
       dialogImageUrl:null,
       //默认规则
       defaultWatchStatus:"0",
-      // �罩�
+      // é�®ç½©å±
       loading: true,
-      // 导出�罩�
+      // 导出é�®ç½©å±
       exportLoading: false,
       // 选中数组
       ids: [],
-      // ��个��
+      // ��个�用
       single: true,
-      // �多个��
+      // �多个�用
       multiple: true,
       // 显示�索�件
       showSearch: true,
-      // 总��
+      // 总�数
       total: 0,
       // �业微信SOP  定时任务表格数�
       qwSopLogsList: [],
 
-      //�员状�
+      //æˆ�员状æ€
       sysQwSopLogsStatus:[],
 
-      //客户接收状�
+      //客户接收状æ€
       groupMsgSendStatusOptions:[],
 
-      //SOP课程观看状�
+      //SOP课程观看状æ€
       sysFsSopWatchStatus:[],
 
       //��的消�
@@ -172,9 +185,9 @@ export default {
         isDialogVisible:false,
         selectedContentJson: [],
       },
-      // 弹出层标�
+      // 弹出层标题
       title: "",
-      // 是�显示弹出�
+      // 是å�¦æ˜¾ç¤ºå¼¹å‡ºå±
       open: false,
       // 查询�数
       queryParams: {
@@ -185,7 +198,7 @@ export default {
         sendStatus: null,
         sendTime: null,
         receivingStatus: null,
-        watchStatus:null,
+        watchStatus:0,
       },
       // 表��数
       form: {},
@@ -197,17 +210,17 @@ export default {
   created() {
     this.getList();
 
-    //�员状�
+    //æˆ�员状æ€
     this.getDicts("sys_qw_sopLogs_status").then(response => {
       this.sysQwSopLogsStatus = response.data;
     });
 
-    //客户接收状�
+    //客户接收状æ€
     this.getDicts("sys_qw_groupMsg_SendStatus").then(response => {
       this.groupMsgSendStatusOptions = response.data;
     });
 
-    //客户观看状�
+    //客户观看状æ€
     this.getDicts("sys_fs_sop_watch_status").then(response => {
       this.sysFsSopWatchStatus = response.data;
     });
@@ -216,7 +229,7 @@ export default {
     /** 查询�业微信SOP  定时任务列表 */
     getList() {
       this.loading = true;
-      listSopLogs(this.queryParams).then(response => {
+      listSopLogsCVOList(this.queryParams).then(response => {
         this.qwSopLogsList = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -261,11 +274,11 @@ export default {
     },
 
     openImageViewer(url) {
-      // 打开大图预览对��
+      // 打开大图预览对è¯�æ¡
       this.dialogImageUrl=url
       this.dialogVisible = true;
     },
-    //查看��的消��
+    //查看å�‘é€�的消æ�¯ä½
     showContentDialog(contentJson) {
 
       this.contentDialog.selectedContentJson = JSON.parse(contentJson);
@@ -281,16 +294,36 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    // 多选框选中数�
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 删除按钮�作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是�确认删除看课SOP日志编�为"' + ids + '"的数�项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "�消",
+        type: "warning"
+      }).then(function() {
+        return delSopLogs(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除�功");
+      }).catch(() => {});
+    },
     /** 导出按钮�作 */
     handleExport() {
       const queryParams = this.queryParams;
-      this.$confirm('是�确认导出所有�业微信SOP  定时任务数��', "警告", {
+      this.$confirm('是�确认导出所有�业微信SOP  定时任务数�项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "�消",
           type: "warning"
         }).then(() => {
           this.exportLoading = true;
-          return exportQwSopLogs(queryParams);
+          return exportSopLogs(queryParams);
         }).then(response => {
           this.download(response.msg);
           this.exportLoading = false;

+ 20 - 186
src/views/course/userCourseCategory/index.vue

@@ -4,7 +4,7 @@
       <el-form-item label="分类�称" prop="cateName">
         <el-input
           v-model="queryParams.cateName"
-          placeholder="请输入分类��
+          placeholder="请输入分类�称"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -70,28 +70,6 @@
           v-hasPermi="['course:userCourseCategory:export']"
         >导出</el-button>
       </el-col>
-      <el-col :span="1.5">
-        <el-button
-          plain
-          type="info"
-          icon="el-icon-upload2"
-          size="mini"
-          @click="handleImport"
-          v-hasPermi="['course:userCourseCategory:importData']"
-        >导入</el-button>
-      </el-col>
-
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="warning"-->
-<!--          plain-->
-<!--          icon="el-icon-download"-->
-<!--          size="mini"-->
-<!--          :loading="exportLoading"-->
-<!--          @click="handleFansExport"-->
-<!--          v-hasPermi="['course:userCourseCategory:fansExport']"-->
-<!--        >�粉导出</el-button>-->
-<!--      </el-col>-->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -101,12 +79,10 @@
       :data="userCourseCategoryList"
       row-key="cateId"
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
-    @selection-change="handleSelectionChange"
     >
-      <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="分类id" align="left" prop="cateId" />
       <el-table-column label="分类�称" align="left" prop="cateName" />
-      <el-table-column  label="状� align="center" prop="isShow">
+      <el-table-column  label="状�" align="center" prop="isShow">
         <template slot-scope="scope">
           <div>
             <el-tag v-if="scope.row.isShow === 1" :type="''">显示</el-tag>
@@ -122,14 +98,14 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['course:userCourseCategory:edit']"
+            v-hasPermi="['store:storeProductCategory:edit']"
           >修改</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['course:userCourseCategory:remove']"
+            v-hasPermi="['store:storeProductCategory:remove']"
           >删除</el-button>
         </template>
       </el-table-column>
@@ -150,66 +126,32 @@
           <treeselect v-model="form.pid" :options="categoryOptions" :normalizer="normalizer" placeholder="请选择上级分类" />
         </el-form-item>
         <el-form-item label="分类�称" prop="cateName">
-          <el-input v-model="form.cateName" placeholder="请输入分类�� />
+          <el-input v-model="form.cateName" placeholder="请输入分类�称" />
         </el-form-item>
         <!-- <el-form-item label="图标"  prop="pic" v-if="form.pid!=0">
            <Material v-model="picArr" type="image" :num="1" :width="150" :height="150" />
         </el-form-item> -->
-        <el-form-item label="状� prop="isShow">
+        <el-form-item label="状�" prop="isShow">
             <el-radio v-model="form.isShow" label="1">显示</el-radio>
             <el-radio v-model="form.isShow" label="0">��</el-radio>
         </el-form-item>
         <el-form-item label="排�" prop="sort">
-          <el-input-number v-model="form.sort" placeholder="请输入排� />
+          <el-input-number v-model="form.sort" placeholder="请输入排�" />
         </el-form-item>
 
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">ç¡?å®?/el-button>
-        <el-button @click="cancel">��/el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 导入 -->
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">
-          将文件拖到此处,�
-          <em>点击上传</em>
-        </div>
-        <div class="el-upload__tip" slot="tip">
-          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模�</el-link>
-        </div>
-        <div class="el-upload__tip" style="color:red" slot="tip">�示:仅�许导入“xls�或“xlsx�格�文件�</div>
-      </el-upload>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" :loading="upload.isUploading" :disabled="upload.isUploading" @click="submitFileForm">ç¡?å®?/el-button>
-        <el-button @click="upload.open = false">��/el-button>
-      </div>
-    </el-dialog>
-    <el-dialog title="导入结果" :close-on-press-escape="false" :close-on-click-modal="false" :visible.sync="importMsgOpen" width="500px" append-to-body>
-      <div class="import-msg" v-safe-html="importMsg">
-      </div>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="importMsgOpen = false">å…?é—?/el-button>
-        <el-button
-          v-if="failList && failList.length > 0"
-          type="primary"
-          v-hasPermi="['course:userCourseCategory:exportFail']"
-          @click="handleExportFailList(failList)"
-          :loading="exportFailLoading"
-        >导出失败信�</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">� 消</el-button>
       </div>
     </el-dialog>
   </div>
 </template>
 
 <script>
-import { listUserCourseCategory, getUserCourseCategory, delUserCourseCategory, addUserCourseCategory, updateUserCourseCategory, exportUserCourseCategory, exportFans,importTemplate, exportFail } from "@/api/course/userCourseCategory";
+import { listUserCourseCategory, getUserCourseCategory, delUserCourseCategory, addUserCourseCategory, updateUserCourseCategory, exportUserCourseCategory } from "@/api/course/userCourseCategory";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-import { getToken } from '@/utils/auth'
 export default {
   name: "UserCourseCategory",
   components: {
@@ -217,27 +159,27 @@ export default {
   },
   data() {
     return {
-      orOptions:[],
       categoryOptions:[],
-      // �罩�
+      orOptions:[],
+      // �罩层
       loading: true,
-      // 导出�罩�
+      // 导出é�®ç½©å±
       exportLoading: false,
       // 选中数组
       ids: [],
-      // ��个��
+      // ��个�用
       single: true,
-      // �多个��
+      // �多个�用
       multiple: true,
       // 显示�索�件
       showSearch: true,
-      // 总��
+      // 总�数
       total: 0,
       // 课堂分类表格数�
       userCourseCategoryList: [],
-      // 弹出层标�
+      // 弹出层标题
       title: "",
-      // 是�显示弹出�
+      // 是å�¦æ˜¾ç¤ºå¼¹å‡ºå±
       open: false,
       // 查询�数
       queryParams: {
@@ -259,23 +201,6 @@ export default {
         cateName: [
           { required: true, message: "分类�称�能为空", trigger: "blur" }
         ],
-      },
-      // 导入
-      importMsgOpen:false,
-      exportFailLoading: false,
-      failList:[],
-      importMsg: '',
-      upload: {
-        // 是�显示弹出层(文件导入�
-        open: false,
-        // 弹出层标题(文件导入�
-        title: "",
-        // 是��用上传
-        isUploading: false,
-        // 设置上传的请求头�
-        headers: { Authorization: "Bearer " + getToken() },
-        // 上传的地�
-        url: process.env.VUE_APP_BASE_API + "/course/userCourseCategory/importData",
       }
     };
   },
@@ -348,8 +273,6 @@ export default {
       this.ids = selection.map(item => item.cateId)
       this.single = selection.length!==1
       this.multiple = !selection.length
-
-      console.log("selection",  selection);
     },
     /** 新增按钮�作 */
     handleAdd() {
@@ -393,7 +316,7 @@ export default {
     /** 删除按钮�作 */
     handleDelete(row) {
       const cateIds = row.cateId || this.ids;
-      this.$confirm('是�确认删除课堂分类编��' + cateIds + '"的数�项?', "警告", {
+      this.$confirm('是�确认删除课堂分类编�为"' + cateIds + '"的数�项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "�消",
           type: "warning"
@@ -418,96 +341,7 @@ export default {
           this.download(response.msg);
           this.exportLoading = false;
         }).catch(() => {});
-    },
-    // 下载模�
-    importTemplate() {
-      importTemplate().then((response) => {
-        this.download(response.msg);
-      });
-    },
-    // 导入
-    handleImport() {
-      this.upload.title = "导入题目";
-      this.upload.open = true;
-    },
-    submitFileForm() {
-      this.$refs.upload.submit();
-    },
-    // 文件上传中处�
-    handleFileUploadProgress(event, file, fileList) {
-      this.upload.isUploading = true;
-    },
-    // 文件上传�功处�
-    handleFileSuccess(response, file, fileList) {
-      this.upload.open = false;
-      this.upload.isUploading = false;
-      this.$refs.upload.clearFiles();
-      this.importMsgOpen=true;
-      this.importMsg = response.data.message
-      this.failList = response.data.failList
-      this.getList();
-    },
-    // 导出失败信�
-    handleExportFailList(failList) {
-      if (!failList || failList.length === 0) {
-        this.msgError("没有失败信��导�);
-        return;
-      }
-      this.exportFailLoading = true;
-      this.$confirm('是�确认导出失败信�?', "�示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "�消",
-        type: "info"
-      }).then(() => {
-        // 调用导出失败信�的API
-        exportFail(failList).then(response => {
-          this.download(response.msg);
-          this.msgSuccess("失败信�导出�功");
-          this.exportFailLoading = false;
-        }).catch(() => {
-          this.msgError("失败信�导出失败");
-          this.exportFailLoading = false;
-        });
-      }).catch(() => {
-        this.exportFailLoading = false;
-      });
-    },
-    handleFansExport() {
-      if (!Array.isArray(this.ids) || this.ids.length === 0) {
-        this.$message.warning('请先选择至少一�数�);
-        return;
-      }
-
-      const params = { ids: this.ids };
-
-      this.$confirm('是�确认导出�粉?', '警告', {
-        confirmButtonText: '确定',
-        cancelButtonText: '�消',
-        type: 'warning'
-      }).then(() => {
-        const loading = this.$loading({
-          lock: true,
-          text: '正在导出数�,请��..',
-          spinner: 'el-icon-loading',
-          background: 'rgba(0, 0, 0, 0.3)'
-        });
-
-        return exportFans(params)
-          .then(res => {
-            if (res.code !== 200){
-              this.$message.warning(res.msg);
-              return;
-            }
-
-            this.download(res.msg);
-          })
-
-          .finally(() => {
-            loading.close();
-          });
-      });
     }
-    },
-
+  }
 };
 </script>

+ 34 - 34
src/views/crm/customer/line.vue

@@ -4,7 +4,7 @@
       <el-form-item label="客户编�" prop="customerCode">
         <el-input
           v-model="queryParams.customerCode"
-          placeholder="请输入客户编�
+          placeholder="请输入客户编�"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -13,7 +13,7 @@
       <el-form-item label="客户�称" prop="customerName">
         <el-input
           v-model="queryParams.customerName"
-          placeholder="请输入客户��
+          placeholder="请输入客户�称"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -22,7 +22,7 @@
       <el-form-item label="手机" prop="mobile">
         <el-input
           v-model="queryParams.mobile"
-          placeholder="请输入手�
+          placeholder="请输入手机"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -43,7 +43,7 @@
           v-model="dateRange"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日� end-placeholder="结�日期"  @change="handleScheduleTimeChange"
+          start-placeholder="开始日期" end-placeholder="结�日期"  @change="handleScheduleTimeChange"
            >
         </el-date-picker>
       </el-form-item>
@@ -123,13 +123,13 @@
 	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
-      <el-tab-pane label="待分� name="0"></el-tab-pane>
-      <el-tab-pane label="已分� name="1"></el-tab-pane>
+      <el-tab-pane label="待分�" name="0"></el-tab-pane>
+      <el-tab-pane label="已分�" name="1"></el-tab-pane>
     </el-tabs>
     <el-table  height="500" border v-loading="loading" :data="customerList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="ID" align="center" prop="customerId" />
-      <el-table-column label="所属公� align="center" prop="companyName" />
+      <el-table-column label="所属公�" align="center" prop="companyName" />
       <el-table-column label="客户编�" width="120"  align="center" prop="customerCode" />
       <el-table-column label="客户�称" align="center" prop="customerName" />
       <el-table-column label="手机" align="center" prop="mobile" />
@@ -138,7 +138,7 @@
             <el-tag prop="status" v-for="(item, index) in sexOptions"    v-if="scope.row.sex==item.dictValue">{{item.dictLabel}}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="微信� align="center" prop="weixin" />
+      <el-table-column label="微信�" align="center" prop="weixin" />
       <el-table-column label="所在地" align="center" prop="address" />
       <el-table-column width="105" label="创建时间" align="center" prop="createTime" />
       <el-table-column  label="客户��" align="center" prop="source">
@@ -188,20 +188,20 @@
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
         <el-form-item label="客户�称" prop="customerName">
-          <el-input v-model="form.customerName" placeholder="请输入客户�� />
+          <el-input v-model="form.customerName" placeholder="请输入客户�称" />
         </el-form-item>
         <el-form-item label="手机" prop="mobile">
-          <el-input maxlength="11"  v-model="form.mobile" placeholder="请输入手� />
+          <el-input maxlength="11"  v-model="form.mobile" placeholder="请输入手机" />
         </el-form-item>
         <el-form-item label="性别" prop="sex">
           <el-radio-group v-model="form.sex">
             <el-radio :label="item.dictValue" v-for="item in sexOptions" >{{item.dictLabel}}</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="微信� prop="weixin">
+        <el-form-item label="微信�" prop="weixin">
           <el-input v-model="form.weixin" placeholder="请输入微信�" />
         </el-form-item>
-        <el-form-item label="所在地� prop="address">
+        <el-form-item label="所在地区" prop="address">
           <el-cascader
           ref="citySelect"
           v-model="cityIds"
@@ -259,10 +259,10 @@
           </el-date-picker>
         </el-form-item>
         <el-form-item label="进线链接" prop="registerLinkUrl">
-          <el-input v-model="form.registerLinkUrl" placeholder="请输入进线链� />
+          <el-input v-model="form.registerLinkUrl" placeholder="请输入进线链接" />
         </el-form-item>
         <el-form-item label="进线客户详情" prop="registerDesc">
-          <el-input v-model="form.registerDesc" placeholder="请输入进线客户详� />
+          <el-input v-model="form.registerDesc" placeholder="请输入进线客户详情" />
         </el-form-item>
         <el-form-item label="进线填写时间" prop="registerSubmitTime">
           <el-date-picker
@@ -273,19 +273,19 @@
           </el-date-picker>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input type="textarea" :rows="2" v-model="form.remark"   placeholder="请输入备� />
+          <el-input type="textarea" :rows="2" v-model="form.remark"   placeholder="请输入备注" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">ç¡?å®?/el-button>
-        <el-button @click="cancel">��/el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">� 消</el-button>
       </div>
     </el-dialog>
     <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
       <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">
-          将文件拖到此处,�
+          将文件拖到此处,æˆ
           <em>点击上传</em>
         </div>
         <div class="el-upload__tip" slot="tip">
@@ -294,12 +294,12 @@
         <div class="el-upload__tip" style="color:red" slot="tip">�示:仅�许导入“xls�或“xlsx�格�文件�</div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">ç¡?å®?/el-button>
-        <el-button @click="upload.open = false">��/el-button>
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">� 消</el-button>
       </div>
     </el-dialog>
     <el-dialog title="导入结果" :close-on-press-escape="false" :close-on-click-modal="false" :visible.sync="importMsgOpen" width="500px" append-to-body>
-       <div class="import-msg" v-safe-html="importMsg">
+       <div class="import-msg" v-html="importMsg">
        </div>
     </el-dialog>
 
@@ -359,13 +359,13 @@ export default {
       },
       // 用户导入�数
       upload: {
-        // 是�显示弹出层(用户导入�
+        // 是å�¦æ˜¾ç¤ºå¼¹å‡ºå±‚(用户导入ï¼
         open: false,
-        // 弹出层标题(用户导入�
+        // 弹出层标题(用户导入ï¼
         title: "",
         // 是��用上传
         isUploading: false,
-        // 设置上传的请求头�
+        // 设置上传的请求头部
         headers: { Authorization: "Bearer " + getToken() },
         // 上传的地�
         url: process.env.VUE_APP_BASE_API + "/crm/customer/importLineData",
@@ -378,24 +378,24 @@ export default {
       inputValue: '',
       sourceOptions:[],
       sexOptions:[],
-      // �罩�
+      // é�®ç½©å±
       loading: true,
       // 选中数组
       ids: [],
-      // ��个��
+      // ��个�用
       single: true,
-      // �多个��
+      // �多个�用
       multiple: true,
       // 显示�索�件
       showSearch: true,
-      // 总��
+      // 总�数
       total: 0,
       // 客户表格数�
       customerList: [],
       dateRange:[],
-      // 弹出层标�
+      // 弹出层标题
       title: "",
-      // 是�显示弹出�
+      // 是å�¦æ˜¾ç¤ºå¼¹å‡ºå±
       open: false,
       isAdmin:false,
       // 查询�数
@@ -439,7 +439,7 @@ export default {
       // 表�校验
       rules: {
         mobile: [
-          { required: true, message: "手机��能为�, trigger: "blur" }
+          { required: true, message: "手机��能为空", trigger: "blur" }
         ],
         source: [
           { required: true, message: "客户���能为空", trigger: "blur" }
@@ -615,7 +615,7 @@ export default {
             that.$refs.assignCompany.init(this.ids);
            }, 200);
       // }else{
-      //      this.msgError("无����");
+      //      this.msgError("无���作!");
       // }
 
       // //获�所有CUSTOMER列表
@@ -710,7 +710,7 @@ export default {
     /** 删除按钮�作 */
     handleDelete(row) {
       const customerIds = row.customerId || this.ids;
-      this.$confirm('是�确认删除客户编��' + customerIds + '"的数�项?', "警告", {
+      this.$confirm('是�确认删除客户编�为"' + customerIds + '"的数�项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "�消",
           type: "warning"
@@ -745,7 +745,7 @@ export default {
         this.download(response.msg);
       });
     },
-    // 文件上传中处�
+    // 文件上传中处ç�
     handleFileUploadProgress(event, file, fileList) {
       this.upload.isUploading = true;
     },

+ 2 - 2
src/views/his/reward/goodsDetail.vue

@@ -40,7 +40,7 @@
         <el-descriptions-item label="排�" >
           <span>{{item.sort}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="状� >
+        <el-descriptions-item label="状�" >
           <dict-tag :options="statusOptions" :value="item.status"/>
         </el-descriptions-item>
         <el-descriptions-item label="创建时间" >
@@ -59,7 +59,7 @@
       <div class="desct">
         商��述
       </div>
-      <span v-safe-html="item.goodsDesc"></span>
+      <span v-html="item.goodsDesc"></span>
     </div>
   </div>
 </template>

+ 5 - 5
src/views/hisStore/components/chineseMedicineDetails.vue

@@ -15,14 +15,14 @@
           </el-descriptions-item>
           <el-descriptions-item label="中��称"><span v-if="item!=null">{{item.medicineName}}</span></el-descriptions-item>
           <el-descriptions-item label="排�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
-          <el-descriptions-item label="状�><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="状�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="是�常�"><span v-if="item!=null"><dict-tag :options="isUsualOptions" :value="item.isUsual"/></span></el-descriptions-item>
           <el-descriptions-item label="归�"><span v-if="item!=null">{{item.vessel}}</span></el-descriptions-item>
           <el-descriptions-item label="五味"span="3"><span v-if="item!=null">{{item.flavor}}</span></el-descriptions-item>
-          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-safe-html="item.action"></span></span></el-descriptions-item>
-          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-safe-html="item.usageMethod"></span></span></el-descriptions-item>
-          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-safe-html="item.descs"></span></span></el-descriptions-item>
-          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-safe-html="item.msg"></span></span></el-descriptions-item>
+          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-html="item.action"></span></span></el-descriptions-item>
+          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-html="item.usageMethod"></span></span></el-descriptions-item>
+          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-html="item.descs"></span></span></el-descriptions-item>
+          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-html="item.msg"></span></span></el-descriptions-item>
         </el-descriptions>
     </div>
 

+ 6 - 6
src/views/hisStore/components/diseaseDetails.vue

@@ -17,12 +17,12 @@
             <el-descriptions-item label="疾病编�" >
                 <span v-if="item!=null">{{item.diseaseCode}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="所属科� >
+            <el-descriptions-item label="所属科室" >
                 <span v-if="item!=null">{{item.deptName}}</span>
             </el-descriptions-item>
 
 
-            <el-descriptions-item label="状� >
+            <el-descriptions-item label="状�" >
              <span v-if="item!=null">
                    <dict-tag :options="statusOptions" :value="item.status"/>
              </span>
@@ -30,7 +30,7 @@
             <el-descriptions-item label="创建时间" >
                 <span v-if="item!=null">{{item.createTime}}</span>
             </el-descriptions-item>
-            <el-descriptions-item label="简� span="6">
+            <el-descriptions-item label="简介" span="6">
                 <span v-if="item!=null">{{item.introduction}}</span>
             </el-descriptions-item>
 
@@ -38,11 +38,11 @@
                 <span v-if="item!=null">{{item.diagnose}}</span>
             </el-descriptions-item>
             <el-descriptions-item label="症状" span="6">
-                      <span v-safe-html="item.symptom"></span>
+                      <span v-html="item.symptom"></span>
 
             </el-descriptions-item>
-            <el-descriptions-item label="检� span="6">
-                      <span v-safe-html="item.inspect"></span>
+            <el-descriptions-item label="检验" span="6">
+                      <span v-html="item.inspect"></span>
             </el-descriptions-item>
         </el-descriptions>
     </div>

+ 4 - 4
src/views/hisStore/components/doctorArticleDetails.vue

@@ -11,7 +11,7 @@
         <el-descriptions-item label="文章ID"  >
             <span v-if="item!=null">{{item.articleId}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="��� >
+        <el-descriptions-item label="��图" >
           <el-popover v-if="item!=null"
             placement="right"
             title=""
@@ -27,11 +27,11 @@
             <span v-if="item!=null">{{item.title}}</span>
         </el-descriptions-item>
 
-        <el-descriptions-item label="�览� >
+        <el-descriptions-item label="�览�" >
             <span v-if="item!=null">{{item.views}}</span>
         </el-descriptions-item>
 
-        <el-descriptions-item label="状� >
+        <el-descriptions-item label="状�" >
         <span v-if="item!=null">
               <dict-tag :options="articleStatus" :value="item.status"/>
         </span>
@@ -43,7 +43,7 @@
             <span v-if="item!=null">{{item.updateTime}}</span>
         </el-descriptions-item>
         <el-descriptions-item label="内容" >
-            <span v-if="item!=null" v-safe-html="item.content"></span>
+            <span v-if="item!=null" v-html="item.content"></span>
         </el-descriptions-item>
       </el-descriptions>
     </div>

+ 6 - 6
src/views/hisStore/components/famousPrescribeDetails.vue

@@ -15,14 +15,14 @@
             </el-descriptions-item>
           <el-descriptions-item label="�典�方�称"><span v-if="item!=null">{{item.prescribeName}}</span></el-descriptions-item>
           <el-descriptions-item label="排�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
-          <el-descriptions-item label="状�><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="状�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="方剂类型"><span v-if="item!=null"> <dict-tag :options="prescribeTypeOptions" :value="item.prescribeType"/></span></el-descriptions-item>
            <el-descriptions-item label="主治疾病"><span v-if="item!=null">{{item.indication}}</span></el-descriptions-item>
           <el-descriptions-item label="归属书�" span="3"><span v-if="item!=null">{{item.belongBook}}</span></el-descriptions-item>
-          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-safe-html="item.action"></span></span></el-descriptions-item>
-          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-safe-html="item.usageMethod"></span></span></el-descriptions-item>
-          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-safe-html="item.descs"></span></span></el-descriptions-item>
-          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-safe-html="item.msg"></span></span></el-descriptions-item>
+          <el-descriptions-item label="�物作用"span="3"><span v-if="item!=null"><span v-html="item.action"></span></span></el-descriptions-item>
+          <el-descriptions-item label="用�方法" span="3"><span v-if="item!=null"> <span v-html="item.usageMethod"></span></span></el-descriptions-item>
+          <el-descriptions-item label="基本信�" span="3"><span v-if="item!=null"> <span v-html="item.descs"></span></span></el-descriptions-item>
+          <el-descriptions-item label="注�事项" span="3"><span v-if="item!=null"> <span v-html="item.msg"></span></span></el-descriptions-item>
           <el-descriptions-item label="创建时间"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
 
         </el-descriptions>
@@ -40,7 +40,7 @@ import { listFamousPrescribe, getFamousPrescribe, delFamousPrescribe, addFamousP
       return {
         // 方剂类型字典
         prescribeTypeOptions: [],
-        // 状�字�
+        // 状�字典
         statusOptions: [],
         item:null,
       }

+ 4 - 4
src/views/hisStore/components/integralGoodsDetails.vue

@@ -7,7 +7,7 @@
         <div class="desct"> 积分商�信�</div>
         <el-descriptions title="" :column="3" border>
           <el-descriptions-item label="商��称"><span v-if="item!=null">{{item.goodsName}}</span></el-descriptions-item>
-          <el-descriptions-item label="���> <el-image v-if="item.imgUrl!=null"
+          <el-descriptions-item label="��图"> <el-image v-if="item.imgUrl!=null"
                   style="width: 100px"
                   :src="item.imgUrl"
                   :preview-src-list="[item.imgUrl]">
@@ -19,13 +19,13 @@
           <el-descriptions-item label="所需积分"><span v-if="item!=null">{{item.integral}}</span></el-descriptions-item>
           <el-descriptions-item label="排�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
           <el-descriptions-item label="库存"><span v-if="item!=null">{{item.stock}}</span></el-descriptions-item>
-          <el-descriptions-item label="状�><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="状�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="创建时间"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
         </el-descriptions>
     </div>
     <div class="contentx" v-if="item!=null">
         <div class="desct"> 积分商�信�</div>
-    <span v-safe-html="item.descs"></span>
+    <span v-html="item.descs"></span>
     </div>
 
     </div>
@@ -39,7 +39,7 @@ import { listIntegralGoods, getIntegralGoods, delIntegralGoods, addIntegralGoods
       return {
         // 商�分类字典
         goodsTypeOptions: [],
-        // 状�字�
+        // 状�字典
         statusOptions: [],
         item:null,
       }

+ 2 - 2
src/views/hisStore/components/medicatedFoodDetails.vue

@@ -19,9 +19,9 @@
           <el-descriptions-item label="椋熸潗"><span v-if="item!=null">{{item.food}}</span></el-descriptions-item>
 
           <el-descriptions-item label="鍒涘缓鏃堕棿"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
-          <el-descriptions-item label="鐘舵€?><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="鐘舵€�"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="涓绘不鐤剧梾" span="3"><span v-if="item!=null" >{{item.indications}}</span></el-descriptions-item>
-          <el-descriptions-item label="鎻忚堪" span="3"><span v-if="item!=null" > <span v-safe-html="item.descs"></span></span></el-descriptions-item>
+          <el-descriptions-item label="鎻忚堪" span="3"><span v-if="item!=null" > <span v-html="item.descs"></span></span></el-descriptions-item>
         </el-descriptions>
     </div>
 

+ 4 - 4
src/views/hisStore/components/vesselDetails.vue

@@ -13,14 +13,14 @@
                     :preview-src-list="[item.imgUrl]">
             </el-image>
           </el-descriptions-item>
-          <el-descriptions-item label="霂瑁��亦�蝏𦦵庖雿滚�蝘?><span v-if="item!=null">{{item.vesselName}}</span></el-descriptions-item>
+          <el-descriptions-item label="霂瑁��亦�蝏𦦵庖雿滚�蝘�"><span v-if="item!=null">{{item.vesselName}}</span></el-descriptions-item>
           <el-descriptions-item label="�鍦�"><span v-if="item!=null">{{item.sort}}</span></el-descriptions-item>
            <el-descriptions-item label="蝏讐�"><span v-if="item!=null">{{item.vessel}}</span></el-descriptions-item>
           <el-descriptions-item label="�其�"><span v-if="item!=null">{{item.region}}</span></el-descriptions-item>
 
-          <el-descriptions-item label="�嗆�?><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="�嗆��"><span v-if="item!=null"> <dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
           <el-descriptions-item label="�𥕦遣�園𡢿"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
-          <el-descriptions-item label="�讛膩"><span  v-if="item!=null" v-safe-html="item.descs" ></span></el-descriptions-item>
+          <el-descriptions-item label="�讛膩"><span  v-if="item!=null" v-html="item.descs" ></span></el-descriptions-item>
         </el-descriptions>
     </div>
 
@@ -35,7 +35,7 @@ import { listVessel, getVessel, delVessel, addVessel, updateVessel, exportVessel
     data() {
       return {
         item:null,
-        // �嗆����?
+        // �嗆����
         statusOptions: [],
       }
     },

+ 48 - 48
src/views/hisStore/storeOrder/promotionList.vue

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
 
-      <el-form-item label="订�� prop="orderCode">
+      <el-form-item label="订��" prop="orderCode">
         <el-input
           v-model="queryParams.orderCode"
           placeholder="请输入订��"
@@ -12,7 +12,7 @@
         />
       </el-form-item>
 
-       <el-form-item label="��� prop="deliveryId">
+       <el-form-item label="���" prop="deliveryId">
         <el-input
           v-model="queryParams.deliveryId"
           placeholder="请输入���"
@@ -22,7 +22,7 @@
         />
       </el-form-item>
 
-      <el-form-item label="手机� prop="userPhone">
+      <el-form-item label="手机�" prop="userPhone">
         <el-input
           v-model="queryParams.userPhone"
           placeholder="请输入手机�"
@@ -36,7 +36,7 @@
         <el-input
 
           v-model="queryParams.companyUserNickName"
-          placeholder="请输入员工姓�
+          placeholder="请输入员工姓�"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -52,8 +52,8 @@
               />
         </el-select>
       </el-form-item>
-      <el-form-item label="物�状� prop="deliveryStatus">
-         <el-select   v-model="queryParams.deliveryStatus" placeholder="请选择物�状� clearable size="small" >
+      <el-form-item label="物�状�" prop="deliveryStatus">
+         <el-select   v-model="queryParams.deliveryStatus" placeholder="请选择物�状�" clearable size="small" >
          <el-option
                 v-for="item in deliveryStatusOptions"
                 :key="item.dictValue"
@@ -62,8 +62,8 @@
               />
         </el-select>
       </el-form-item>
-      <el-form-item label="结算状� prop="deliveryPayStatus">
-         <el-select style="width: 200px" v-model="queryParams.deliveryPayStatus" placeholder="请选择物�结算状� clearable size="small" >
+      <el-form-item label="结算状�" prop="deliveryPayStatus">
+         <el-select style="width: 200px" v-model="queryParams.deliveryPayStatus" placeholder="请选择物�结算状�" clearable size="small" >
          <el-option
                 v-for="item in deliveryPayStatusOptions"
                 :key="item.dictValue"
@@ -79,7 +79,7 @@
           v-model="createTimeRange"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日�
+          start-placeholder="开始日期"
           end-placeholder="结�日期">
         </el-date-picker>
       </el-form-item>
@@ -90,7 +90,7 @@
           v-model="payTimeRange"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日�
+          start-placeholder="开始日期"
           end-placeholder="结�日期">
         </el-date-picker>
       </el-form-item>
@@ -101,7 +101,7 @@
           v-model="deliverySendTimeRange"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日�
+          start-placeholder="开始日期"
           end-placeholder="结�日期">
         </el-date-picker>
       </el-form-item>
@@ -112,7 +112,7 @@
           v-model="deliveryImportTimeRange"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日�
+          start-placeholder="开始日期"
           end-placeholder="结�日期">
         </el-date-picker>
       </el-form-item>
@@ -157,25 +157,25 @@
     </el-row>
     <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
       <el-tab-pane label="全部订�" name="00"></el-tab-pane>
-      <el-tab-pane label="待支� name="0"></el-tab-pane>
-      <el-tab-pane label="待�� name="1"></el-tab-pane>
-      <el-tab-pane label="å¾…æ”¶è´? name="2"></el-tab-pane>
+      <el-tab-pane label="待支付" name="0"></el-tab-pane>
+      <el-tab-pane label="待�货" name="1"></el-tab-pane>
+      <el-tab-pane label="å¾…æ”¶è´§" name="2"></el-tab-pane>
       <el-tab-pane label="交易完�" name="3"></el-tab-pane>
       <el-tab-pane label="退款中" name="-1"></el-tab-pane>
-      <el-tab-pane label="已退� name="-2"></el-tab-pane>
-      <el-tab-pane label="已�� name="-3"></el-tab-pane>
+      <el-tab-pane label="已退款" name="-2"></el-tab-pane>
+      <el-tab-pane label="已�消" name="-3"></el-tab-pane>
     </el-tabs>
     <el-table  height="500" border v-loading="loading" :data="storeOrderList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="订�� align="center" prop="orderCode" width="200px" />
-      <el-table-column label="�起� align="center" prop="initiator" />
-      <el-table-column label="推广人昵� align="center" prop="tuiNickName" />
+      <el-table-column label="订��" align="center" prop="orderCode" width="200px" />
+      <el-table-column label="�起人" align="center" prop="initiator" />
+      <el-table-column label="推广人昵称" align="center" prop="tuiNickName" />
       <el-table-column label="用户昵称" align="center" prop="nickname" width="150px" >
           <template slot-scope="scope">
               <span>{{scope.row.nickname}} </span>
           </template>
       </el-table-column>
-      <el-table-column label="收件� align="center" prop="realName" width="150px" >
+      <el-table-column label="收件人" align="center" prop="realName" width="150px" >
           <template slot-scope="scope">
               <span>{{scope.row.realName}} </span>
           </template>
@@ -204,7 +204,7 @@
           </template>
       </el-table-column>
       <el-table-column label="下�时间" align="center" prop="createTime" />
-      <!-- <el-table-column label="支付状� align="center" prop="paid" /> -->
+      <!-- <el-table-column label="支付状�" align="center" prop="paid" /> -->
       <el-table-column label="支付时间" align="center" prop="payTime" width="180">
       </el-table-column>
       <el-table-column label="支付方�" align="center" prop="payType" >
@@ -212,12 +212,12 @@
               <el-tag prop="payType" v-for="(item, index) in payTypeOptions"    v-if="scope.row.payType==item.dictValue">{{item.dictLabel}}</el-tag>
           </template>
       </el-table-column>
-      <el-table-column label="订�状� align="center" prop="status" >
+      <el-table-column label="订�状�" align="center" prop="status" >
           <template slot-scope="scope">
               <el-tag prop="status" v-for="(item, index) in statusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
           </template>
       </el-table-column>
-      <el-table-column label="物�状� align="center" prop="deliveryStatus" >
+      <el-table-column label="物�状�" align="center" prop="deliveryStatus" >
           <template slot-scope="scope">
               <el-tag prop="status" v-for="(item, index) in deliveryStatusOptions"    v-if="scope.row.deliveryStatus==item.dictValue">{{item.dictLabel}}</el-tag>
           </template>
@@ -283,8 +283,8 @@
                     </template>
                   </el-table-column>
                   <el-table-column label="昵称" align="center" prop="nickname" />
-                  <el-table-column label="手机� align="center" prop="phone" />
-                  <el-table-column label="状� align="center" prop="status" >
+                  <el-table-column label="手机�" align="center" prop="phone" />
+                  <el-table-column label="状�" align="center" prop="status" >
                       <template slot-scope="scope">
                           <el-tag prop="status" v-for="(item, index) in userStatusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
                       </template>
@@ -304,8 +304,8 @@
                        <el-radio :label="scope.row.id"></el-radio>
                     </template>
                 </el-table-column>
-                <el-table-column label="收货人姓� align="center" prop="realName" />
-                <el-table-column label="收货人电� align="center" prop="phone" />
+                <el-table-column label="收货人姓�" align="center" prop="realName" />
+                <el-table-column label="收货人电�" align="center" prop="phone" />
                 <el-table-column label="地�" align="center" prop="detail" >
                     <template slot-scope="scope">
                        {{scope.row.province}} {{scope.row.city}} {{scope.row.district}} {{scope.row.detail}}
@@ -368,8 +368,8 @@
             </el-form-item>
         </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">ç¡?å®?/el-button>
-        <el-button @click="cancel">��/el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">� 消</el-button>
       </div>
     </el-dialog>
     <el-dialog :title="product.title" v-if="product.open"  :visible.sync="product.open" width="1000px" append-to-body>
@@ -391,22 +391,22 @@
       <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">
-          将文件拖到此处,�
+          将文件拖到此处,æˆ
           <em>点击上传</em>
         </div>
         <div class="el-upload__tip" slot="tip">
-          <!-- <el-checkbox v-model="upload.updateSupport" />是�更新已�存在的数�-->
+          <!-- <el-checkbox v-model="upload.updateSupport" />是�更新已�存在的数� -->
           <el-link type="info" style="font-size:12px" @click="importTemplate">下载模�</el-link>
         </div>
         <div class="el-upload__tip" style="color:red" slot="tip">�示:仅�许导入“xls�或“xlsx�格�文件�</div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">ç¡?å®?/el-button>
-        <el-button @click="upload.open = false">��/el-button>
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">� 消</el-button>
       </div>
     </el-dialog>
     <el-dialog title="导入结果" :close-on-press-escape="false" :close-on-click-modal="false" :visible.sync="importMsgOpen" width="500px" append-to-body>
-       <div class="import-msg" v-safe-html="importMsg">
+       <div class="import-msg" v-html="importMsg">
        </div>
     </el-dialog>
 
@@ -450,7 +450,7 @@ export default {
       payTypeOptions:[],
       payQr:{
         open:false,
-        title:"付款二维�
+        title:"付款二维�"
       },
       user:{
         open:false,
@@ -480,23 +480,23 @@ export default {
       },
       activeName:"00",
       statusOptions:[],
-      // �罩�
+      // é�®ç½©å±
       loading: true,
       // 选中数组
       ids: [],
-      // ��个��
+      // ��个�用
       single: true,
-      // �多个��
+      // �多个�用
       multiple: true,
       // 显示�索�件
       showSearch: true,
-      // 总��
+      // 总�数
       total: 0,
       // 订�表格数�
       storeOrderList: [],
-      // 弹出层标�
+      // 弹出层标题
       title: "",
-      // 是�显示弹出�
+      // 是å�¦æ˜¾ç¤ºå¼¹å‡ºå±
       open: false,
       createTimeRange:[],
       payTimeRange:[],
@@ -569,15 +569,15 @@ export default {
 
       },
       upload: {
-        // 是�显示弹出层(用户导入�
+        // 是å�¦æ˜¾ç¤ºå¼¹å‡ºå±‚(用户导入ï¼
         open: false,
-        // 弹出层标题(用户导入�
+        // 弹出层标题(用户导入ï¼
         title: "",
         // 是��用上传
         isUploading: false,
-        // 是�更新已�存在的用户数�
+        // 是�更新已�存在的用户数�
         updateSupport: 0,
-        // 设置上传的请求头�
+        // 设置上传的请求头部
         headers: { Authorization: "Bearer " + getToken() },
         // 上传的地�
         url: process.env.VUE_APP_BASE_API + "/store/storeOrder/importExpress",
@@ -904,7 +904,7 @@ export default {
         this.download(response.msg);
       });
     },
-    // 文件上传中处�
+    // 文件上传中处ç�
     handleFileUploadProgress(event, file, fileList) {
       this.upload.isUploading = true;
     },
@@ -921,7 +921,7 @@ export default {
       this.getList();
     },
 
-        /** 查询部门下拉树结�*/
+        /** 查询部门下拉树结æž*/
     getTreeselect() {
         var that=this;
         var param={companyId:this.companyId}

+ 249 - 61
src/views/qw/sopLogs/sopLogsList.vue

@@ -4,16 +4,16 @@
       <el-form-item label="�微员工账�" prop="qwUserid" v-if="queryParams.type==2">
         <el-input
           v-model="queryParams.qwUserid"
-          placeholder="请输入�微员工账�
+          placeholder="请输入�微员工账�"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="销售昵� prop="qwUserName" v-if="queryParams.type==1">
+      <el-form-item label="销售昵称" prop="qwUserName" v-if="queryParams.type==1">
         <el-input
           v-model="queryParams.qwUserName"
-          placeholder="请输入销售昵�
+          placeholder="请输入销售昵称"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -23,14 +23,14 @@
       <el-form-item label="客户昵称" prop="externalUserName">
         <el-input
           v-model="queryParams.externalUserName"
-          placeholder="请输入客户昵�
+          placeholder="请输入客户昵称"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="��类� prop="sendType" >
-        <el-select v-model="queryParams.sendType" placeholder="请选择��类� clearable size="small">
+      <el-form-item label="��类型" prop="sendType" >
+        <el-select v-model="queryParams.sendType" placeholder="请选择��类型" clearable size="small">
           <el-option
             v-for="dict in sysQwSopType"
             :key="dict.dictValue"
@@ -39,8 +39,8 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="���员)状� prop="sendStatus">
-        <el-select v-model="queryParams.sendStatus" placeholder="请选择���员)状� clearable size="small">
+      <el-form-item label="��(�员)状�" prop="sendStatus">
+        <el-select v-model="queryParams.sendStatus" placeholder="请选择��(�员)状�" clearable size="small">
           <el-option
             v-for="dict in sysQwSopLogsStatus"
             :key="dict.dictValue"
@@ -49,27 +49,27 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="预计��时� prop="scheduleTime">
+      <el-form-item label="预计��时间" prop="scheduleTime">
 <!--        <el-date-picker clearable size="small"-->
 <!--          v-model="queryParams.sendTime"-->
 <!--          type="datetime"-->
 <!--          value-format="yyyy-MM-dd HH:mm:ss"-->
-<!--          placeholder="选择预计��时�>-->
+<!--          placeholder="选择预计��时间">-->
 <!--        </el-date-picker>-->
         <el-date-picker
           clearable size="small"
           v-model="scheduleTime"
           type="datetimerange"
-          range-separator="�
-          start-placeholder="开始日�
+          range-separator="至"
+          start-placeholder="开始日期"
           end-placeholder="结�日期"
-          placeholder="选择预计��时�
+          placeholder="选择预计��时间"
           @change="handleScheduleTimeChange"
         >
         </el-date-picker>
       </el-form-item>
-      <el-form-item label="接收(客户)状� prop="receivingStatus">
-        <el-select v-model="queryParams.receivingStatus" placeholder="请选择接收(客户)状� clearable size="small">
+      <el-form-item label="接收(客户)状�" prop="receivingStatus">
+        <el-select v-model="queryParams.receivingStatus" placeholder="请选择接收(客户)状�" clearable size="small">
           <el-option
             v-for="dict in groupMsgSendStatusOptions"
             :key="dict.dictValue"
@@ -94,18 +94,41 @@
           size="mini"
           :loading="exportLoading"
           @click="handleExport"
+          v-hasPermi="['qw:sopLogs:export']"
         >导出</el-button>
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['qw:sopLogs:remove']"
+        >批�删除</el-button>
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="multiple"
+          @click="handleEditCourse"
+          v-hasPermi="['qw:sopLogs:editCourse']"
+        >�次��记录</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="qwSopLogsList">
-      <el-table-column label="��类� align="center" prop="sendType" width="80">
+    <el-table v-loading="loading" :data="qwSopLogsList"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编�" align="center" prop="id" />
+      <el-table-column label="��类型" align="center" prop="sendType" width="80">
         <template slot-scope="scope">
           <dict-tag :options="sysQwSopType" :value="scope.row.sendType"/>
         </template>
       </el-table-column>
       <el-table-column label="�微�员账�" align="center" prop="qwUserid" />
+      <el-table-column label="�微�员昵称" align="center" prop="qwUserName"  v-if="queryParams.type==2" />
+<!--      <el-table-column label="系统��昵称" align="center" prop="userName" />-->
       <el-table-column label="客户昵称" align="center" prop="externalUserName" />
       <el-table-column label="��的消�" align="center" prop="contentJson" >
         <template slot-scope="scope">
@@ -114,36 +137,63 @@
           </el-button>
         </template>
       </el-table-column>
-      <el-table-column label="�员状� align="center" prop="sendStatus" >
+      <el-table-column label="�员状�" align="center" prop="sendStatus" >
         <template slot-scope="scope">
           <dict-tag :options="sysQwSopLogsStatus" :value="scope.row.sendStatus"/>
         </template>
       </el-table-column>
-      <el-table-column label="预计��时� align="center" prop="sendTime" width="180"/>
-      <el-table-column label="实际��时� align="center" prop="realSendTime" width="180"/>
-      <el-table-column label="接收状� align="center" prop="receivingStatus" >
+      <el-table-column label="预计��时间" align="center" prop="sendTime" width="180"/>
+      <el-table-column label="实际��时间" align="center" prop="realSendTime" width="180"/>
+<!--      <el-table-column label="获�记录" align="center" prop="takeRecords" width="180">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span v-if="scope.row.takeRecords == 0" :style="{ color: 'red' }" >未获�</span>-->
+<!--          <span v-else-if="scope.row.takeRecords == 1" :style="{ color: 'green' }" >已获�</span>-->
+<!--          <span v-else :style="{ color: 'gray' }" >未知状�</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+      <el-table-column label="客户" align="center" prop="receivingStatus" >
         <template slot-scope="scope">
           <dict-tag :options="groupMsgSendStatusOptions" :value="scope.row.receivingStatus"/>
         </template>
       </el-table-column>
+      <el-table-column label="生�时间" align="createTime" prop="createTime" width="180" />
       <el-table-column label="消�ID" align="center" prop="msgId" />
       <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="APP备注" align="center" prop="appSendRemark" />
     </el-table>
 
     <el-dialog :visible.sync="contentDialog.isDialogVisible" title="消�详情" width="30%" append-to-body>
       <div>
         <div v-for="(item, index) in contentDialog.json || []" :key="index">
           <el-card class="box-card" style="margin-top: 2%">
-            <div slot="header" class="clearfix">
-              <span>类型:</span>
-              <span v-if="item.contentType == 1">文本</span>
-              <span v-if="item.contentType == 2">图片</span>
-              <span v-if="item.contentType == 3">�片</span>
-              <span v-if="item.contentType == 5">文件</span>
-              <span v-if="item.contentType == 6">视频</span>
-              <span v-if="item.contentType == 7">语音</span>
+            <div slot="header" class="clearfix" style="display: flex;justify-content: space-between;align-items: center;">
+              <div>
+                <span>类型:</span>
+                <span v-if="item.contentType == 1">文本</span>
+                <span v-if="item.contentType == 2">图片</span>
+                <span v-if="item.contentType == 3">�片</span>
+                <span v-if="item.contentType == 4">�程�</span>
+                <span v-if="item.contentType == 5">文件</span>
+                <span v-if="item.contentType == 6">视频</span>
+                <span v-if="item.contentType == 7">语音</span>
+                <span v-if="item.contentType == 8">视频�</span>
+                <span v-if="item.contentType == 9">APP</span>
+                <span v-if="item.contentType == 10">自定义�程�</span>
+                <span v-if="item.contentType == 12">直播�程�</span>
+                <span v-if="item.contentType == 14">�袋</span>
+                <span v-if="item.contentType == 15">APP文本</span>
+                <span v-if="item.contentType == 16">APP语音</span>
+                <span v-if="item.contentType == 17">�览器看课</span>
+                <span v-if="item.contentType == 4"><el-button size="mini" type="primary" @click="generateShortLink(item)" style="margin-left: 330px;">生�短链</el-button></span>
+              </div>
+              <div v-if="item.sendStatus">
+                <span>��状�:</span>
+                <el-tag type="success" v-if="item.sendStatus == 1">���功</el-tag>
+                <el-tag type="danger" v-if="item.sendStatus == 2">��失败</el-tag>
+              </div>
             </div>
-            <div v-if="item.contentType == 1" v-safe-html="item.value"></div>
+            <div v-if="item.sendStatus && item.sendStatus == 2">��失败原因:<span style="color: #ff4949">{{item.sendRemarks}}</span></div>
+            <div v-if="item.contentType == 1 || item.contentType == 15" v-safe-html="item.value"></div>
             <div v-if="item.contentType == 2">
               <el-image
                 style="width: 100px; height: 100px"
@@ -151,14 +201,14 @@
                 fit="contain"
                 @click.prevent="openImageViewer(item.imgUrl)" />
             </div>
-            <div v-if="item.contentType == 3" class="message-style">
+            <div v-if="item.contentType == 3 || item.contentType == 9" class="message-style">
               <div
                 style="background-color: white; padding: 10px; width: 100%"
                 @click="openLink(item.linkUrl)">
                 <span>{{ item.linkTitle }}</span>
                 <div style="display: flex; justify-content: space-between; width: 100%">
                   <span style="font-size: 13px; flex: 1">{{ item.linkDescribe }}</span>
-                  <!-- 点击图片时�止事件冒�-->
+                  <!-- 点击图片时�止事件冒泡 -->
                   <el-image
                     style="width: 50px; height: 50px; flex-shrink: 0"
                     :src="item.linkImageUrl"
@@ -167,6 +217,16 @@
                 </div>
               </div>
             </div>
+            <div v-if="item.contentType == 4 || item.contentType == 10 || item.contentType == 17" class="message-style">
+                <div style="display: flex; justify-content: space-between; width: 100%">
+                  <span style="font-size: 13px; flex: 1">{{ item.miniprogramTitle }}</span>
+                  <el-image
+                    style="width: 50px; height: 50px; flex-shrink: 0"
+                    :src="item.miniprogramPicUrl"
+                    fit="contain"
+                    @click.stop="openImageViewer(item.miniprogramPicUrl)" />
+                </div>
+            </div>
             <div v-if="item.contentType == 5" class="message-style">
               <el-link type="primary" :href="item.fileUrl" download style="padding: 10px">
                 {{ item.fileUrl }}
@@ -179,7 +239,14 @@
                 style="width: 200px; height: 100px">
               </video>
             </div>
-            <div v-if="item.contentType == 7" v-safe-html="item.voiceText"></div>
+            <div v-if="item.contentType == 7 || item.contentType == 16">
+              <span>
+                {{ item.value }}
+              </span>
+              <div v-if="!item.voiceUrl" style="margin-top: 3px"  >
+                <span style="color: red">无语音地�</span>
+              </div>
+            </div>
 
             <div v-if="item.contentType == 8" class="message-style">
               <el-card class="box-card" v-if="item.coverUrl">
@@ -202,7 +269,7 @@
                     :style="{ width: '200px', height: '200px' }"
                   ></el-image>
                 </el-form-item>
-                <el-form-item label="简�"   label-width="100px" >
+                <el-form-item label="简介:"   label-width="100px" >
                   <el-input type="textarea" :rows="3" v-model="item.desc"  style="width: 90%;margin-top: 1%;" disabled />
                 </el-form-item>
                 <el-form-item label="视频地�:"  label-width="100px" style="margin-top: 1%" >
@@ -219,7 +286,7 @@
       </span>
     </el-dialog>
 
-    <!-- 大图预览对��-->
+    <!-- 大图预览对è¯�æ¡-->
     <el-dialog
       :visible.sync="dialogVisible"
       :modal="false"
@@ -231,6 +298,22 @@
       />
     </el-dialog>
 
+    <el-dialog
+      title="生�短链"
+      :visible.sync="shortLinkDialogVisible"
+      width="30%"
+      v-loading="shortLoading"
+      append-to-body>
+        <el-tooltip placement="top" effect="dark" :content="copyText">
+            <span class="ellipsis" style="max-width:100px;display:inline-block;">{{copyText}}</span>
+        </el-tooltip>
+        <i style="margin-left:120px;cursor: pointer" class="el-icon-document-copy" @click="onCopy"></i>
+        <span slot="footer" class="dialog-footer">
+        <el-button @click="shortLinkDialogVisible = false">� 消</el-button>
+        <el-button type="primary" @click="shortLinkDialogVisible = false">确 定</el-button>
+        </span>
+    </el-dialog>
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -238,23 +321,36 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    <el-dialog :title="videoNumOptions.title" :visible.sync="videoNumOptions.open" width="1500px" append-to-body>
+      <userVideo ref="QwUserVideo" @videoResult="qwUserVideoResult"></userVideo>
+    </el-dialog>
   </div>
+
 </template>
 
 <script>
-import { listQwSopLogs, exportQwSopLogs, listQwSopLogsList } from '@/api/qw/sopLogs'
+import {
+  listQwSopLogs,
+  exportQwSopLogs,
+  listQwSopLogsList,
+  delQwSopLogs,
+  editCourseQwSopLogs,
+  generateShortLink
+} from '../../../api/qw/sopLogs'
+import {delSopUserLogsInfo} from "@/api/qw/sopUserLogsInfo";
+import userVideo from "@/views/qw/userVideo/userVideo";
 import { safeOpen } from '@/utils/safeUrl'
 
 export default {
   name: "sopLogsList",
   props:{
-    rowDetailFrom:{},
+    rowDetailFrom:{userVideo},
   },
 
   watch:{
     rowDetailFrom:{
       handler(newVal){
-        // 当formData�化时�新查�
+        // 当formData�化时�新查询
         this.getList(newVal);
       },
       deep: true
@@ -262,36 +358,44 @@ export default {
   },
   data() {
     return {
-
+      videoNumOptions: {
+        title: '选择视频�',
+        open: false,
+        content: null,
+        contentIndex: null,
+      },
+      copyText:"",
+      shortLoading:false,
+      shortLinkDialogVisible:false,
       //图片放大
       dialogVisible: false,
       dialogImageUrl:null,
       //时间选择
       scheduleTime: null,
-      // �罩�
+      // é�®ç½©å±
       loading: true,
-      // 导出�罩�
+      // 导出é�®ç½©å±
       exportLoading: false,
       // 选中数组
       ids: [],
-      // ��个��
+      // ��个�用
       single: true,
-      // �多个��
+      // �多个�用
       multiple: true,
       // 显示�索�件
       showSearch: true,
-      // 总��
+      // 总�数
       total: 0,
       // �业微信SOP  定时任务表格数�
       qwSopLogsList: [],
 
-      //�员状�
+      //æˆ�员状æ€
       sysQwSopLogsStatus:[],
 
-      //客户接收状�
+      //客户接收状æ€
       groupMsgSendStatusOptions:[],
 
-      //�微SOP��类�
+      //ä¼�å¾®SOPå�‘é€�ç±»åž
       sysQwSopType: [],
 
       //��的消�
@@ -299,9 +403,9 @@ export default {
         isDialogVisible:false,
         json: [],
       },
-      // 弹出层标�
+      // 弹出层标题
       title: "",
-      // 是�显示弹出�
+      // 是å�¦æ˜¾ç¤ºå¼¹å‡ºå±
       open: false,
       // 查询�数
       queryParams: {
@@ -329,17 +433,17 @@ export default {
   created() {
     this.getList(this.rowDetailFrom);
 
-    //�员状�
+    //æˆ�员状æ€
     this.getDicts("sys_qw_sopLogs_status").then(response => {
       this.sysQwSopLogsStatus = response.data;
     });
 
-    //客户接收状�
+    //客户接收状æ€
     this.getDicts("sys_qw_groupMsg_SendStatus").then(response => {
       this.groupMsgSendStatusOptions = response.data;
     });
 
-    //��消�类�
+    //å�‘é€�消æ�¯ç±»åž
     this.getDicts("sys_qw_sop_course_type").then(response => {
       this.sysQwSopType = response.data;
     });
@@ -347,15 +451,36 @@ export default {
 
   },
   methods: {
+
+    qwUserVideoResult(val) {
+
+      // 根�选中的内容,将返回的数�更新到相应的表�项
+      const content = this.videoNumOptions.content;
+      const setList = content[this.videoNumOptions.contentIndex];
+      setList.nickname = val.nickname;
+      setList.avatar = val.avatar;
+      setList.coverUrl = val.coverUrl;
+      setList.thumbUrl = val.thumbUrl;
+      setList.desc = val.desc;
+      setList.url = val.url;
+      setList.extras = val.extras;
+      setList.videoId = val.id;
+      console.info(setList)
+
+      this.videoNumOptions.open = false;
+
+    },
     /** 查询�业微信SOP  定时任务列表 */
     getList(val) {
       this.queryParams.sopId = val.id || this.rowDetailFrom.id;
       this.queryParams.corpId= val.corpId || this.rowDetailFrom.corpId;
       this.queryParams.type= val.type || this.rowDetailFrom.type;
+      this.queryParams.filterSopType=val.filterSopType || this.rowDetailFrom.filterSopType;
       this.loading = true;
 
       listQwSopLogsList(this.queryParams).then(response => {
 
+        // console.log("response.rows",response.rows)
         this.qwSopLogsList = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -372,11 +497,11 @@ export default {
       }
     },
 
-    // 格�化日期为 yyyy-MM-dd HH:mm:ss 的北京时�
+    // 格�化日期为 yyyy-MM-dd HH:mm:ss 的北京时间
     formatDateTime(date) {
       if (!date) return null;
 
-      // 创建国际化时间格�,指定�Asia/Shanghai 时区
+      // 创建国际化时间格�,指定为 Asia/Shanghai 时区
       const options = {
         timeZone: 'Asia/Shanghai',
         year: 'numeric',
@@ -385,13 +510,13 @@ export default {
         hour: '2-digit',
         minute: '2-digit',
         second: '2-digit',
-        hour12: false, // 24�时�
+        hour12: false, // 24å°�æ—¶åˆ
       };
 
-      // 获�格�化的日期字符串(�2025-01-23, 16:00:00�
+      // 获�格�化的日期字符串(如 2025-01-23, 16:00:00)
       const formattedDate = new Intl.DateTimeFormat('zh-CN', options).format(new Date(date));
 
-      // 转��yyyy-MM-dd HH:mm:ss 格�
+      // 转�为 yyyy-MM-dd HH:mm:ss 格�
       const [datePart, timePart] = formattedDate.replace(',', '').split(' ');
       return `${datePart} ${timePart}`;
     },
@@ -421,16 +546,16 @@ export default {
     },
 
     openImageViewer(url) {
-      // 打开大图预览对��
+      // 打开大图预览对è¯�æ¡
       this.dialogImageUrl=url
       this.dialogVisible = true;
     },
     openLink(url){
       if (!safeOpen(url, '_blank')) {
-        this.$message && this.$message.warning('链接�安全,已拦�);
+        this.$message && this.$message.warning('链接�安全,已拦截');
       }
     },
-    //查看��的消��
+    //查看å�‘é€�的消æ�¯ä½
     showContentDialog(contentJson) {
 
       // 解� JSON 字符串为 JavaScript 对象
@@ -450,12 +575,51 @@ export default {
     /** �置按钮�作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.queryParams.scheduleStartTime=null;
+      this.queryParams.scheduleEndTime=null;
+      this.scheduleTime = null;
       this.handleQuery();
     },
+    // 多选框选中数�
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 删除按钮�作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是�确认删除�执行详情】编�为"�' + ids + '】"的数�项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "�消",
+        type: "warning"
+      }).then(function() {
+        return delQwSopLogs(ids);
+      }).then(() => {
+        this.getList(this.rowDetailFrom);
+        this.msgSuccess("删除�功");
+      }).catch(() => {});
+    },
+    /**
+     * 批�修改��记录
+     */
+    handleEditCourse(row){
+      const ids = row.id || this.ids;
+      this.$confirm('确认��次���执行详情】编�为"�' + ids + '】"的记录?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "�消",
+        type: "warning"
+      }).then(function() {
+        return editCourseQwSopLogs(ids);
+      }).then(() => {
+        this.getList(this.rowDetailFrom);
+        this.msgSuccess("已� 修改记录为 待��~");
+      }).catch(() => {});
+    },
     /** 导出按钮�作 */
     handleExport() {
       const queryParams = this.queryParams;
-      this.$confirm('是�确认导出所有�业微信SOP  定时任务数��', "警告", {
+      this.$confirm('是�确认导出所有�业微信SOP  定时任务数�项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "�消",
           type: "warning"
@@ -466,7 +630,25 @@ export default {
           this.download(response.msg);
           this.exportLoading = false;
         }).catch(() => {});
+    },
+
+    //生�短链
+    generateShortLink(val){
+      const param = {
+        linkStr:val.miniprogramPage,
+        appId:val.miniprogramAppid
+      };
+      generateShortLink(param).then(res=>{
+        this.copyText = res.urlLink;
+      });
+      this.shortLinkDialogVisible = true;
+    },
+    onCopy(){
+      navigator.clipboard.writeText(this.copyText).then(() => {
+        this.$message.success('�制�功')
+    })
     }
+
   }
 };
 </script>
@@ -485,4 +667,10 @@ export default {
 .message-stayle span {
   word-break: break-all;
 }
+.ellipsis {
+        max-width:100px;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        display: inline-block;
+}
 </style>

+ 3 - 2
src/views/qw/sopTemp/addSopTemp.vue

@@ -358,6 +358,7 @@ import {courseList, videoList} from "@/api/qw/sop";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
 import FriendMaterial from "@/views/qw/friendMaterial/index.vue";
 import userVideo from "@/views/qw/userVideo/userVideo.vue";
+import { filterSopContentTypes } from "@/utils/sopVoice";
 
 export default {
   name: "addSopTemp",
@@ -455,11 +456,11 @@ export default {
     });
 
     this.getDicts("sys_qwSopAi_contentType").then(response => {
-      this.sysQwSopAiContentType = response.data;
+      this.sysQwSopAiContentType = filterSopContentTypes(response.data);
     });
 
     this.getDicts("sys_qwSop_contentType").then(response => {
-      this.sysQwSopContentType = response.data;
+      this.sysQwSopContentType = filterSopContentTypes(response.data);
     });
     this.getDicts("sys_qwSop_settingType").then(response => {
       this.sysQwSopSettingType = response.data;

+ 18 - 10
src/views/qw/sopTemp/updateSopTemp.vue

@@ -249,41 +249,44 @@
                                       <el-form v-if="form.sendType != 4" :model="setList" label-width="70px">
                                         <el-form-item label="内容类别" style="margin: 2%">
                                           <div v-if="form.sendType == 1 ">
-                                            <el-radio-group v-model="setList.contentType" :disabled="formType == 3">
+                                            <el-radio-group v-model="setList.contentType" :disabled="formType == 3 || isSopVoiceLocked(setList.contentType)">
                                               <!--                                              <el-radio  :label="item.dictValue" v-for="item in sysQwSopContentType">{{item.dictLabel}}</el-radio>-->
                                               <el-radio
                                                 v-for="item in sysQwSopContentType"
+                                                v-if="showSopContentTypeOption(item.dictValue, setList.contentType)"
                                                 :key="item.dictValue"
                                                 :label="item.dictValue"
-                                                :disabled="item.dictValue === '1' && content.setting.some(s => s.contentType == '1') ">
+                                                :disabled="(item.dictValue === '1' && content.setting.some(s => s.contentType == '1')) || (isSopVoiceType(item.dictValue) && !sopVoiceEnabled)">
                                                 {{ item.dictLabel }}
                                               </el-radio>
                                             </el-radio-group>
                                           </div>
                                           <div v-if="form.sendType == 2">
                                             <el-radio-group v-model="setList.contentType"
-                                                            :disabled="formType == 3"
+                                                            :disabled="formType == 3 || isSopVoiceLocked(setList.contentType)"
                                                             @change="handleContentTypeChange(content,index,contentIndex,setIndex, item, 'contentType', $event)">
                                               <el-radio
                                                 :key="item.dictValue"
                                                 :label="item.dictValue"
-                                                :disabled="(content.type!=2 && item.dictValue === '9') || (content.isOfficial==1 && ['5','6','7','8','9'].includes(item.dictValue))"
-                                                v-for="item in sysQwSopAiContentType">{{ item.dictLabel }}
+                                                :disabled="(content.type!=2 && item.dictValue === '9') || (content.isOfficial==1 && ['5','6','7','8','9'].includes(item.dictValue)) || (isSopVoiceType(item.dictValue) && !sopVoiceEnabled)"
+                                                v-for="item in sysQwSopAiContentType"
+                                                v-if="showSopContentTypeOption(item.dictValue, setList.contentType)">{{ item.dictLabel }}
                                               </el-radio>
                                             </el-radio-group>
                                           </div>
                                           <div v-if="form.sendType == 11">
                                             <el-radio-group v-model="setList.contentType"
-                                                            :disabled="formType == 3 || (form.sendType == 11 && contentIndex != 0 && setIndex == 0)"
+                                                            :disabled="formType == 3 || (form.sendType == 11 && contentIndex != 0 && setIndex == 0) || isSopVoiceLocked(setList.contentType)"
                                                             @change="handleContentTypeChange(content,index,contentIndex,setIndex, item, 'contentType', $event)">
                                               <el-radio
                                                 :key="item.dictValue"
                                                 :label="item.dictValue"
-                                                :disabled="(content.type!=2 && item.dictValue === '9') || (content.isOfficial==1 && ['5','6','7','8','9'].includes(item.dictValue))"
-                                                v-for="item in sysQwSopAiContentType" v-if="setIndex == 0 ? courseTypeList.includes(item.dictValue) : !courseTypeList.includes(item.dictValue)">{{ item.dictLabel }}
+                                                :disabled="(content.type!=2 && item.dictValue === '9') || (content.isOfficial==1 && ['5','6','7','8','9'].includes(item.dictValue)) || (isSopVoiceType(item.dictValue) && !sopVoiceEnabled)"
+                                                v-for="item in sysQwSopAiContentType" v-if="(setIndex == 0 ? courseTypeList.includes(item.dictValue) : !courseTypeList.includes(item.dictValue)) && (showSopContentTypeOption(item.dictValue, setList.contentType))">{{ item.dictLabel }}
                                               </el-radio>
                                             </el-radio-group>
                                           </div>
+                                          <div v-if="isSopVoiceLocked(setList.contentType)" class="tip" style="margin: 0 2% 8px;color:#909399;font-size:12px;">语音/APP语音已停用,仅可删除该内容,不可修改</div>
                                         </el-form-item>
                                         <el-form-item label="内容">
                                           <el-input :disabled="formType == 3" v-if="setList.contentType == 1 "
@@ -419,9 +422,9 @@
                                               </video>
                                             </el-form-item>
                                           </div>
-                                          <div v-if="setList.contentType == 7 ">
+                                          <div v-if="setList.contentType == 7 || setList.contentType == 16">
                                             <el-input
-                                              :disabled="formType == 3"
+                                              :disabled="formType == 3 || isSopVoiceLocked(setList.contentType)"
                                               v-model="setList.value"
                                               type="textarea" :rows="3" maxlength="66" show-word-limit
                                               placeholder="输入要转为语音的内容"
@@ -701,6 +704,7 @@ import {
 import {courseList, videoList} from "@/api/qw/sop";
 import ImageUpload from "@/views/qw/sop/ImageUpload";
 import userVideo from "@/views/qw/userVideo/userVideo.vue";
+import { isSopVoiceEnabled, isSopVoiceLocked, isSopVoiceType, showSopContentTypeOption } from "@/utils/sopVoice";
 
 export default {
   name: "updateSopTemp",
@@ -720,6 +724,7 @@ export default {
       uploadUrlByVoice: process.env.VUE_APP_BASE_API + "/common/uploadOSSByHOOKVoice",
       //上传语音的遮罩层
       voiceLoading: false,
+      sopVoiceEnabled: isSopVoiceEnabled(),
       openSort: false,
       openSort2: false,
       // 遮罩层
@@ -833,6 +838,9 @@ export default {
     this.handleUpdate(id);
   },
   methods: {
+    isSopVoiceLocked,
+    isSopVoiceType,
+    showSopContentTypeOption,
     handleClose(index, tag, content) {
       content.addTag.splice(content.addTag.indexOf(tag), 1);
     },

+ 2 - 1
src/views/qw/sopUserLogs/sopUserLogsSchedule.vue

@@ -100,6 +100,7 @@
 <script>
 import { listSopUserLogs, getSopUserLogs, delSopUserLogs, addSopUserLogs, updateSopUserLogs, exportSopUserLogs } from "@/api/qw/sopUserLogs";
 import SopUserLogsInfoDetails from "@/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue";
+import { filterSopContentTypes } from "@/utils/sopVoice";
 export default {
   name: "sopUserLogsSchedule",
   components: {SopUserLogsInfoDetails},
@@ -176,7 +177,7 @@ export default {
       this.sopUserLogsDelStatus = response.data;
     });
     this.getDicts("sys_qwSopAi_contentType").then(response => {
-      this.sysQwSopAiContentType = response.data;
+      this.sysQwSopAiContentType = filterSopContentTypes(response.data);
     });
     this.queryParams.sopId = this.$route.params.id;
     this.sopName = this.$route.query.name;

+ 2 - 1
src/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue

@@ -69,6 +69,7 @@ import {
   exportSopUserLogsInfo,
   sendMsgSop
 } from "@/api/qw/sopUserLogsInfo";
+import { filterSopContentTypes } from "@/utils/sopVoice";
 
 
 export default {
@@ -145,7 +146,7 @@ export default {
   },
   created() {
     this.getDicts("sys_qwSopAi_contentType").then(response => {
-      this.sysQwSopAiContentType = response.data;
+      this.sysQwSopAiContentType = filterSopContentTypes(response.data);
     });
     this.getDicts("sys_fs_sop_watch_status").then(response => {
       this.sysFsSopWatchStatus = response.data;

+ 18 - 18
src/views/tool/gen/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="表�� prop="tableName">
+      <el-form-item label="表�称" prop="tableName">
         <el-input
           v-model="queryParams.tableName"
           placeholder="请输入表�称"
@@ -10,7 +10,7 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="表�� prop="tableComment">
+      <el-form-item label="表�述" prop="tableComment">
         <el-input
           v-model="queryParams.tableComment"
           placeholder="请输入表�述"
@@ -27,7 +27,7 @@
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
-          start-placeholder="开始日�
+          start-placeholder="开始日期"
           end-placeholder="结�日期"
         ></el-date-picker>
       </el-form-item>
@@ -91,14 +91,14 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="表��
+        label="表�称"
         align="center"
         prop="tableName"
         :show-overflow-tooltip="true"
         width="120"
       />
       <el-table-column
-        label="表��
+        label="表�述"
         align="center"
         prop="tableComment"
         :show-overflow-tooltip="true"
@@ -169,7 +169,7 @@
           :name="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))"
           :key="key"
         >
-        <pre><code class="hljs" v-safe-html="highlightedCode(value, key)"></code></pre>
+        <pre><code class="hljs" v-html="highlightedCode(value, key)"></code></pre>
         </el-tab-pane>
       </el-tabs>
     </el-dialog>
@@ -195,23 +195,23 @@ export default {
   components: { importTable },
   data() {
     return {
-      // �罩�
+      // é�®ç½©å±
       loading: true,
-      // 唯一标识�
+      // 唯一标识符
       uniqueId: "",
       // 选中数组
       ids: [],
-      // 选中表数�
+      // 选中表数ç»
       tableNames: [],
-      // ��个��
+      // ��个�用
       single: true,
-      // �多个��
+      // �多个�用
       multiple: true,
       // 显示�索�件
       showSearch: true,
-      // 总��
+      // 总�数
       total: 0,
-      // 表数�
+      // 表数�
       tableList: [],
       // 日期范围
       dateRange: "",
@@ -243,7 +243,7 @@ export default {
     }
   },
   methods: {
-    /** 查询表集�*/
+    /** 查询表集� */
     getList() {
       this.loading = true;
       listTable(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
@@ -267,16 +267,16 @@ export default {
       }
       if(row.genType === "1") {
         genCode(row.tableName).then(response => {
-          this.msgSuccess("�功生�到自定义路径� + row.genPath);
+          this.msgSuccess("�功生�到自定义路径:" + row.genPath);
         });
       } else {
         downLoadZip("/tool/gen/batchGenCode?tables=" + tableNames, "fs");
       }
     },
-    /** �步数�库��*/
+    /** �步数�库�作 */
     handleSynchDb(row) {
       const tableName = row.tableName;
-      this.$confirm('确认�强制��' + tableName + '"表结构��, "警告", {
+      this.$confirm('确认�强制�步"' + tableName + '"表结构�?', "警告", {
         confirmButtonText: "确定",
         cancelButtonText: "�消",
         type: "warning"
@@ -286,7 +286,7 @@ export default {
           this.msgSuccess("�步�功");
       }).catch(() => {});
     },
-    /** 打开导入表弹�*/
+    /** 打开导入表弹çª*/
     openImportTable() {
       this.$refs.import.show();
     },