Преглед изворни кода

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_adminUI

caoliqin пре 3 недеља
родитељ
комит
4ca930c0f1

+ 3 - 3
.env.prod-hsyy

@@ -1,7 +1,7 @@
 # 页面标题
-VUE_APP_TITLE =河山医院
+VUE_APP_TITLE =河山恒康
 # 首页菜单标题
-VUE_APP_TITLE_INDEX =河山医院
+VUE_APP_TITLE_INDEX =河山恒康
 # 公司名称
 VUE_APP_COMPANY_NAME =哈尔滨市河山医院有限公司
 # ICP备案号
@@ -9,7 +9,7 @@ VUE_APP_ICP_RECORD =蒙ICP备2024019526号-1
 # ICP网站访问地址
 VUE_APP_ICP_URL =https://beian.miit.gov.cn
 # 网站LOG
-VUE_APP_LOG_URL =@/assets/logo/hsyy.png
+VUE_APP_LOG_URL =@/assets/logo/hsyynew.jpg
 # 存储桶配置
 VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
 # 存储桶配置

+ 3 - 3
.env.prod-mengniu

@@ -1,7 +1,7 @@
 # 页面标题
-VUE_APP_TITLE =舒康时代总管理系统
+VUE_APP_TITLE =康享未来总管理系统
 # 首页菜单标题
-VUE_APP_TITLE_INDEX =舒康时代管理系统
+VUE_APP_TITLE_INDEX =康享未来管理系统
 # 公司名称
 VUE_APP_COMPANY_NAME =重庆云联融智科技有限公司
 # ICP备案号
@@ -9,7 +9,7 @@ VUE_APP_ICP_RECORD =渝ICP备2024031984号-1
 # ICP网站访问地址
 VUE_APP_ICP_URL =https://beian.miit.gov.cn
 # 网站LOG
-VUE_APP_LOG_URL =@/assets/logo/shukang.png
+VUE_APP_LOG_URL =@/assets/logo/kxwl.png
 # 存储桶配置
 VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
 # 存储桶配置

+ 7 - 0
src/api/his/company.js

@@ -111,3 +111,10 @@ export function exitMiniProgram(data) {
     data: data
   })
 }
+
+export function getGatewayCompanyList(companyId) {
+  return request({
+    url: '/easyCall/gateway/getGatewayCompanyList',
+    method: 'get'
+  })
+}

+ 8 - 0
src/api/system/config.js

@@ -89,3 +89,11 @@ export function updateIsTownOn(query) {
     params: query
   })
 }
+
+export function getGatewayList(query) {
+  return request({
+    url: '/easyCall/gateway/list',
+    method: 'get',
+    params: query
+  })
+}

BIN
src/assets/logo/hsyynew.jpg


BIN
src/assets/logo/kxwl.png


+ 0 - 0
src/assets/images/shukang.png → src/assets/logo/shukang.png


+ 86 - 1
src/views/components/course/userCourseCatalogDetails.vue

@@ -118,6 +118,10 @@
           <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
                      v-hasPermi="['course:userCourseVideo:remove']">删除
           </el-button>
+          <el-button size="mini"
+                     type="text" v-if="projectFrom === 'myhk'" @click="openXsyDialog(scope.row)">
+            复制参数
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -514,6 +518,29 @@
         <el-button @click="cancelEditCoverForm">取 消</el-button>
       </div>
     </el-dialog>
+
+    <!-- 销售易参数弹窗 -->
+    <el-dialog
+      title="复制销售易参数"
+      :visible.sync="xsyDialogVisible"
+      width="500px"
+      append-to-body
+    >
+      <div style="margin-bottom: 20px;">
+        <el-input
+          v-model="xsyParams"
+          type="textarea"
+          :rows="3"
+          readonly
+          placeholder="参数将显示在这里"
+          class="xsy-textarea"
+        />
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="xsyDialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="copyXsyParams">复制参数</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -589,6 +616,7 @@ export default {
       open: false,
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
       baseUrl: process.env.VUE_APP_BASE_API,
+      projectFrom:process.env.VUE_APP_PROJECT,
       typeOptions: [],
       files: [],
       fileList: [],
@@ -698,7 +726,10 @@ export default {
             {required: true, message: "视频封面不能为空", trigger: "change"}
           ],
         }
-      }
+      },
+      // 销售易弹窗
+      xsyDialogVisible: false,
+      xsyParams: '',
     }
   },
   created() {
@@ -1445,6 +1476,56 @@ export default {
         thumbnail: null,
       }
     },
+    // 复制销售易链接
+    openXsyDialog(row) {
+      // 构建JSON字符串
+      const courseData = {
+        videoId: row.videoId,
+        courseId: row.courseId,
+        companyId: 0
+      };
+
+      this.xsyParams = `pages_course/videoxsy?course=${JSON.stringify(courseData)}`;
+      this.xsyDialogVisible = true;
+    },
+    // 复制销售易参数
+    copyXsyParams() {
+      this.copyLink(this.xsyParams);
+    },
+    copyLink(url) {
+      const link = url;
+      // navigator clipboard 需要https等安全上下文
+      if (navigator.clipboard && window.isSecureContext) {
+        // navigator clipboard 向剪贴板写文本
+        navigator.clipboard.writeText(link).then(() => {
+          this.$message.success('链接已复制到剪贴板');
+        });
+      } else {
+        // document.execCommand('copy') 向剪贴板写文本
+        let input = document.createElement('input')
+        input.style.position = 'fixed'
+        input.style.top = '-10000px'
+        input.style.zIndex = '-999'
+        document.body.appendChild(input)
+        input.value = link
+        input.focus()
+        input.select()
+        try {
+          let result = document.execCommand('copy')
+          document.body.removeChild(input)
+          if (!result || result === 'unsuccessful') {
+            this.$message.error('复制失败');
+            console.log('复制失败')
+          } else {
+            this.$message.success('链接已复制到剪贴板');
+            console.log('复制成功')
+          }
+        } catch (e) {
+          document.body.removeChild(input)
+          alert('当前浏览器不支持复制功能,请检查更新或更换其他浏览器操作')
+        }
+      }
+    },
 
   }
 }
@@ -1455,6 +1536,10 @@ export default {
   align-items: center;
   justify-content: center;
 }
+.xsy-textarea >>> .el-textarea__inner {
+ background-color: #f5f5f5 !important;
+ resize: none !important;
+}
 </style>
 <style>
 .avatar-uploader .el-upload {

+ 43 - 2
src/views/course/coursePlaySourceConfig/index.vue

@@ -152,6 +152,11 @@
           <dict-tag  :options="typesOptions" :value="scope.row.type"/>
         </template>
       </el-table-column>
+      <el-table-column label="授权方式" align="center" prop="authType">
+        <template slot-scope="scope">
+          <dict-tag  :options="authTypeOptions" :value="scope.row.authType"/>
+        </template>
+      </el-table-column>
       <el-table-column label="互医/商城小程序" align="center" prop="isMall" width="80px">
         <template slot-scope="scope">
           <el-tag prop="isMall" v-for="(item, index) in isMallOptions" v-if="scope.row.isMall==item.dictValue">{{item.dictLabel}}</el-tag>
@@ -309,6 +314,17 @@
         <el-form-item label="图标" prop="img">
           <image-upload v-model="form.img" :file-type='["png", "jpg", "jpeg"]' :limit="1"/>
         </el-form-item>
+        <el-form-item label="授权方式" prop="authType">
+          <el-select
+            v-model="form.authType"
+            placeholder="请选择授权方式">
+            <el-option
+              v-for="item in authTypeOptions"
+              :key="item.dictValue"
+              :label="item.dictLabel"
+              :value="item.dictValue"/>
+          </el-select>
+        </el-form-item>
         <el-form-item label="类型" prop="type">
           <el-select
             v-model="form.type"
@@ -341,7 +357,7 @@
 
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button type="primary" @click="showOpenPlatformWarning">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
@@ -437,6 +453,7 @@ export default {
     return {
       sysPayModes: [],
       bindCurrentRow: {},
+      authTypeOptions: [],
       bindForm:{
         bindTitle: '绑定支付配置',
         bindShow: false,
@@ -516,6 +533,7 @@ export default {
       title: null,
       open: false,
       form: {
+        authType:'1',
         setCompanyIdList: []
       },
       bindRules:{
@@ -561,6 +579,9 @@ export default {
     }
   },
   created() {
+    this.getDicts("play_config_auth_type").then(response => {
+      this.authTypeOptions = response.data;
+    });
     this.getDicts("sys_pay_mode").then(response => {
       this.sysPayModes = response.data;
     });
@@ -584,6 +605,25 @@ export default {
       this.companyOptions = [];
       this.open = false;
     },
+    showOpenPlatformWarning() {
+      if (this.form.authType=='1'){
+        this.$confirm('必须绑定开放平台,否则会导致看课冲突。是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          // 用户点击确定,执行原有提交逻辑
+          this.submitForm()
+        }).catch(() => {
+          // 用户点击取消,停留在当前弹窗,不执行任何操作
+          // 可以在这里添加一些提示信息
+          console.log('用户取消提交')
+        })
+      }else {
+        this.submitForm()
+      }
+
+    },
     // 协议配置处理
     handleAgreement(row) {
       // 获取当前行的协议相关信息
@@ -817,7 +857,8 @@ export default {
       get(id).then(response => {
         this.form = {
           ...response.data,
-          type: response.data.type.toString()
+          type: response.data.type.toString(),
+          authType: response.data.authType ? response.data.authType.toString() : '1'
         }
         if(!!this.form.setCompanyIds){
            this.$set(

+ 16 - 13
src/views/course/userCoursePeriod/courseStatistics.vue

@@ -170,13 +170,13 @@
             <el-col :span="6">
               <div class="stat-item">
                 <div class="stat-label">人均看课时长</div>
-                <div class="stat-value">{{ (detailDialog.data.avgWatchDurationMinutes || 0) + '分' }}</div>
+                <div class="stat-value">{{ formatDuration(detailDialog.data.avgWatchDurationMinutes)}}</div>
               </div>
             </el-col>
             <el-col :span="6">
               <div class="stat-item">
                 <div class="stat-label">人均完课时长</div>
-                <div class="stat-value">{{ (detailDialog.data.avgCompletedDuration || 0) + '分' }}</div>
+                <div class="stat-value">{{ formatDuration(detailDialog.data.avgCompletedDuration)}}</div>
               </div>
             </el-col>
             <el-col :span="6">
@@ -232,7 +232,7 @@
             </el-col>
             <el-col :span="6">
               <div class="stat-item">
-                <div class="stat-label">领红包人数</div>
+                <div class="stat-label">领红包/积分人数</div>
                 <div class="stat-value">{{ detailDialog.data.redPacketUserCount || 0 }}</div>
               </div>
             </el-col>
@@ -573,17 +573,20 @@ export default {
     },
     /** 格式化时长 */
     formatDuration(seconds) {
-      if (!seconds) return '0秒';
-      const hours = Math.floor(seconds / 3600);
-      const minutes = Math.floor((seconds % 3600) / 60);
-      const secs = seconds % 60;
-      if (hours > 0) {
-        return `${hours}小时${minutes}分钟${secs}秒`;
-      } else if (minutes > 0) {
-        return `${minutes}分钟${secs}秒`;
-      } else {
-        return `${secs}秒`;
+      if (seconds == null || isNaN(seconds)) return '0秒';
+      let total = Math.abs(seconds);
+      const hours = Math.floor(total / 3600);
+      const minutes = Math.floor((total % 3600) / 60);
+      const secs = Math.floor(total % 60);
+
+      const parts = [];
+      if (hours > 0) parts.push(`${hours}小时`);
+      if (minutes > 0) parts.push(`${minutes}分`);
+      if (secs > 0 || parts.length === 0) {
+        parts.push(`${secs}秒`);
       }
+
+      return parts.join('');
     }
   }
 };

+ 17 - 2
src/views/his/company/index.vue

@@ -475,6 +475,17 @@
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入备注"/>
         </el-form-item>
+         <el-form-item label="可用外呼网关" prop="showGatewayIds">
+            <!-- <el-input v-model="" placeholder="请输入DeepSeekChat模型名称"></el-input> -->
+             <el-select v-model="form.showGatewayIds" multiple filterable placeholder="请选择系统可见外呼网关">
+              <el-option
+                v-for="item in gatewayList"
+                :key="item.id"
+                :label="item.gwDesc"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
       </el-form>
 
 
@@ -741,7 +752,7 @@ import {
   exportCompany,
   resetPwd,
   getDivConfig,
-  setDiv, exitMiniProgram
+  setDiv, exitMiniProgram,getGatewayCompanyList
 } from '@/api/his/company'
 import { getFollowDoctorList } from '@/api/his/doctor'
 import { docList } from '@/api/his/doctor'
@@ -756,7 +767,7 @@ export default {
   name: 'Company',
   data() {
     return {
-
+      gatewayList:[],
       projectFrom:process.env.VUE_APP_HSY_SPACE,
 
       signProjectName:"",
@@ -941,6 +952,10 @@ export default {
     }
   },
   created() {
+    getGatewayCompanyList().then(res=>{
+        this.gatewayList = res.data;
+        console.log(this.gatewayList);
+    }).catch(res=>{});
 
     cateList().then((response) => {
       if (this.projectFrom =='mengniu-2114522511'){

+ 30 - 1
src/views/system/config/config.vue

@@ -31,6 +31,29 @@
               <el-input-number v-model="form40.numberCalls" :min="1" :step="1" :precision="0" placeholder="例如: 1"></el-input-number>
             </el-form-item>
           </template>
+           <el-form-item label="DeepSeekChat模型并发数" prop="DeepSeekChatConcurrency">
+            <el-input v-model="form40.concurrency" placeholder="请输入DeepSeekChat模型并发数"></el-input>
+          </el-form-item>
+          <el-form-item label="DeepSeekChat服务地址" prop="DeepSeekChatServerAddress">
+            <el-input v-model="form40.serverAddress" placeholder="请输入DeepSeekChat服务地址"></el-input>
+          </el-form-item>
+          <el-form-item label="DeepSeekChat_apiKey" prop="DeepSeekChatApiKey">
+           <el-input v-model="form40.apiKey" placeholder="请输入DeepSeekChat_apiKey"></el-input>
+          </el-form-item>
+          <el-form-item label="DeepSeekChat模型名称" prop="DeepSeekChatModelName">
+            <el-input v-model="form40.modelName" placeholder="请输入DeepSeekChat模型名称"></el-input>
+          </el-form-item>
+          <el-form-item label="系统可见外呼网关" prop="showGatewayIds">
+            <!-- <el-input v-model="" placeholder="请输入DeepSeekChat模型名称"></el-input> -->
+             <el-select v-model="form40.showGatewayIds" multiple filterable placeholder="请选择系统可见外呼网关">
+              <el-option
+                v-for="item in gatewayList"
+                :key="item.id"
+                :label="item.gwDesc"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
 
           <div class="footer">
             <el-button type="primary" @click="submitForm40">提 交</el-button>
@@ -2767,7 +2790,7 @@
 </template>
 
 <script>
-import { getConfigByKey, updateConfigByKey, clearCache, updateIsTownOn } from '@/api/system/config'
+import { getConfigByKey, updateConfigByKey, clearCache, updateIsTownOn,getGatewayList } from '@/api/system/config'
 import { listStore } from '@/api/his/storeProduct'
 import { js } from 'js-beautify'
 import Material from '@/components/Material'
@@ -2793,6 +2816,7 @@ export default {
   },
   data() {
     return {
+      gatewayList:[],
       isBeiJingZhuoMei:false,
       citys: [],
       images: [],
@@ -3040,6 +3064,11 @@ export default {
     }
   },
   created() {
+        getGatewayList().then(res=>{
+      this.gatewayList = res.data;
+      console.log(this.gatewayList);
+    }).catch(res=>{
+    })
     this.checkProjectName();
     this.getConfigByKey(this.activeName)
     listStore().then(response => {