Explorar el Código

Merge remote-tracking branch 'origin/master'

yfh hace 9 horas
padre
commit
0223103d67
Se han modificado 35 ficheros con 3655 adiciones y 109 borrados
  1. 40 0
      .env.prod-bjyjb
  2. 40 0
      .env.prod-cqxzt
  3. 40 0
      .env.prod-kyt
  4. 3 0
      package.json
  5. 53 0
      src/api/his/physicalReportTemplate.js
  6. 71 0
      src/api/his/physicalReportTemplateField.js
  7. 19 3
      src/api/his/storeOrder.js
  8. 9 0
      src/api/his/userOperationLog.js
  9. 53 0
      src/api/qw/qwIpadServer.js
  10. 53 0
      src/api/qw/qwIpadServerLog.js
  11. 53 0
      src/api/qw/qwIpadServerUser.js
  12. BIN
      src/assets/logo/bjyjb.jpg
  13. BIN
      src/assets/logo/cqxzt.png
  14. BIN
      src/assets/logo/ylrz.png
  15. 1 1
      src/components/VideoUpload/index.vue
  16. 4 3
      src/views/components/course/userCourseCatalogDetails.vue
  17. 1 1
      src/views/components/his/packageOrderDetails.vue
  18. 17 2
      src/views/course/courseWatchLog/index.vue
  19. 41 5
      src/views/course/userCourseComplaintRecord/index.vue
  20. 4 2
      src/views/course/videoResource/index.vue
  21. 3 1
      src/views/his/package/index.vue
  22. 383 0
      src/views/his/physicalReportTemplate/index.vue
  23. 688 0
      src/views/his/physicalReportTemplateField/index.vue
  24. 766 47
      src/views/his/storeOrder/order1.vue
  25. 7 3
      src/views/his/storeProduct/index.vue
  26. 5 2
      src/views/his/storeProductCategory/index.vue
  27. 5 5
      src/views/his/user/userBehavior.vue
  28. 358 0
      src/views/qw/qwIpadServer/index.vue
  29. 342 0
      src/views/qw/qwIpadServerLog/index.vue
  30. 308 0
      src/views/qw/qwIpadServerUser/index.vue
  31. 19 7
      src/views/statistics/section/channel.vue
  32. 18 7
      src/views/statistics/section/index.vue
  33. 18 7
      src/views/statistics/section/inline.vue
  34. 19 7
      src/views/statistics/section/today.vue
  35. 214 6
      src/views/system/config/config.vue

+ 40 - 0
.env.prod-bjyjb

@@ -0,0 +1,40 @@
+# 页面标题
+VUE_APP_TITLE =医健宝互联网医院管理系统
+# 首页菜单标题
+VUE_APP_TITLE_INDEX =医健宝互联网医院
+# 公司名称
+VUE_APP_COMPANY_NAME =医健宝智慧(北京)医药科技有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =
+# ICP网站访问地址
+VUE_APP_ICP_URL =
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/bjyjb.jpg
+# 存储桶配置
+VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
+# 存储桶配置
+VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
+# 存储桶配置
+VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
+# 存储桶配置
+VUE_APP_OBS_BUCKET = bjyjb-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = bjyjb-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://cqxzttcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://cqxztobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 40 - 0
.env.prod-cqxzt

@@ -0,0 +1,40 @@
+# 页面标题
+VUE_APP_TITLE =襄之棠互联网医院管理系统
+# 首页菜单标题
+VUE_APP_TITLE_INDEX =襄之棠互联网医院
+# 公司名称
+VUE_APP_COMPANY_NAME =重庆襄之棠大药房连锁有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =
+# ICP网站访问地址
+VUE_APP_ICP_URL =
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/cqxzt.png
+# 存储桶配置
+VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
+# 存储桶配置
+VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
+# 存储桶配置
+VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
+# 存储桶配置
+VUE_APP_OBS_BUCKET = cqxzt-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = cqxzt-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://cqxzttcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://cqxztobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 40 - 0
.env.prod-kyt

@@ -0,0 +1,40 @@
+# 页面标题
+VUE_APP_TITLE =互联网医院管理系统
+# 首页菜单标题
+VUE_APP_TITLE_INDEX =互联网医院管理系统
+# 公司名称
+VUE_APP_COMPANY_NAME =重庆云联融智科技有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =渝ICP备2024031984号-1
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/ylrz.png
+# 存储桶配置
+VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
+# 存储桶配置
+VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
+# 存储桶配置
+VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
+# 存储桶配置
+VUE_APP_OBS_BUCKET = kyt-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = kyt-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://kyttcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://kytobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'development'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
package.json

@@ -26,7 +26,10 @@
     "build:prod-drk": "vue-cli-service build --mode prod-drk",
     "build:prod-qdtst": "vue-cli-service build --mode prod-qdtst",
     "build:prod-jkj": "vue-cli-service build --mode prod-jkj",
+    "build:prod-kyt": "vue-cli-service build --mode prod-kyt",
     "build:stage": "vue-cli-service build --mode staging",
+    "build:prod-cqxzt": "vue-cli-service build --mode prod-cqxzt",
+    "build:prod-bjyjb": "vue-cli-service build --mode prod-bjyjb",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src"
   },

+ 53 - 0
src/api/his/physicalReportTemplate.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询体检报告模板列表
+export function listFSPhysicalReportTemplate(query) {
+  return request({
+    url: '/his/physicalReportTemplate/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询体检报告模板详细
+export function getFSPhysicalReportTemplate(id) {
+  return request({
+    url: '/his/physicalReportTemplate/' + id,
+    method: 'get'
+  })
+}
+
+// 新增体检报告模板
+export function addFSPhysicalReportTemplate(data) {
+  return request({
+    url: '/his/physicalReportTemplate',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改体检报告模板
+export function updateFSPhysicalReportTemplate(data) {
+  return request({
+    url: '/his/physicalReportTemplate',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除体检报告模板
+export function delFSPhysicalReportTemplate(id) {
+  return request({
+    url: '/his/physicalReportTemplate/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出体检报告模板
+export function exportFSPhysicalReportTemplate(query) {
+  return request({
+    url: '/his/physicalReportTemplate/export',
+    method: 'get',
+    params: query
+  })
+}

+ 71 - 0
src/api/his/physicalReportTemplateField.js

@@ -0,0 +1,71 @@
+import request from '@/utils/request'
+
+// 查询体检报告模板字段列表
+export function listPhysicalReportTemplateField(query) {
+  return request({
+    url: '/his/physicalReportTemplateField/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询体检报告模板字段详细
+export function getPhysicalReportTemplateField(id) {
+  return request({
+    url: '/his/physicalReportTemplateField/' + id,
+    method: 'get'
+  })
+}
+
+// 新增体检报告模板字段
+export function addPhysicalReportTemplateField(data) {
+  return request({
+    url: '/his/physicalReportTemplateField',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改体检报告模板字段
+export function updatePhysicalReportTemplateField(data) {
+  return request({
+    url: '/his/physicalReportTemplateField',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除体检报告模板字段
+export function delPhysicalReportTemplateField(id) {
+  return request({
+    url: '/his/physicalReportTemplateField/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出体检报告模板字段
+export function exportPhysicalReportTemplateField(query) {
+  return request({
+    url: '/his/physicalReportTemplateField/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出体检报告模板字段
+export function getTemplateField(templateId) {
+  return request({
+    url: '/his/physicalReportTemplateField/getTemplateField/'+templateId,
+    method: 'post'
+  })
+}
+
+
+// 新增体检报告模板字段
+export function saveTemplate(data) {
+  return request({
+    url: '/his/physicalReportTemplateField/saveTemplate',
+    method: 'post',
+    data: data
+  })
+}

+ 19 - 3
src/api/his/storeOrder.js

@@ -1,11 +1,11 @@
 import request from '@/utils/request'
 
 // 查询订单列表
-export function listOrder(query) {
+export function listOrder(data) {
   return request({
     url: '/his/storeOrder/list',
-    method: 'get',
-    params: query
+    method: 'post',
+    data: data
   })
 }
 // 下载导入模板
@@ -264,4 +264,20 @@ export function batchCreateErpOrder(data) {
     method: 'post',
     data: data
   })
+}
+
+export function batchSetErpOrder(data) {
+  return request({
+    url: '/his/storeOrder/batchSetErpOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+
+export function getErpAccount() {
+  return request({
+    url: '/his/storeOrder/getErpAccount',
+    method: 'get'
+  })
 }

+ 9 - 0
src/api/his/userOperationLog.js

@@ -8,3 +8,12 @@ export function listUserOperationLog(query) {
     params: query
   })
 }
+
+// 查询用户操作日志类型
+export function getOperationType() {
+  return request({
+    url: '/his/userOperationLog/getOperationType',
+    method: 'get'
+  })
+}
+

+ 53 - 0
src/api/qw/qwIpadServer.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询ipad服务器列表
+export function listQwIpadServer(query) {
+  return request({
+    url: '/qw/qwIpadServer/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询ipad服务器详细
+export function getQwIpadServer(id) {
+  return request({
+    url: '/qw/qwIpadServer/' + id,
+    method: 'get'
+  })
+}
+
+// 新增ipad服务器
+export function addQwIpadServer(data) {
+  return request({
+    url: '/qw/qwIpadServer',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改ipad服务器
+export function updateQwIpadServer(data) {
+  return request({
+    url: '/qw/qwIpadServer',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除ipad服务器
+export function delQwIpadServer(id) {
+  return request({
+    url: '/qw/qwIpadServer/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出ipad服务器
+export function exportQwIpadServer(query) {
+  return request({
+    url: '/qw/qwIpadServer/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/qw/qwIpadServerLog.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询ipad服务器日志列表
+export function listQwIpadServerLog(query) {
+  return request({
+    url: '/qw/qwIpadServerLog/ipadServerLogList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询ipad服务器日志详细
+export function getQwIpadServerLog(id) {
+  return request({
+    url: '/qw/qwIpadServerLog/' + id,
+    method: 'get'
+  })
+}
+
+// 新增ipad服务器日志
+export function addQwIpadServerLog(data) {
+  return request({
+    url: '/qw/qwIpadServerLog',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改ipad服务器日志
+export function updateQwIpadServerLog(data) {
+  return request({
+    url: '/qw/qwIpadServerLog',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除ipad服务器日志
+export function delQwIpadServerLog(id) {
+  return request({
+    url: '/qw/qwIpadServerLog/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出ipad服务器日志
+export function exportQwIpadServerLog(query) {
+  return request({
+    url: '/qw/qwIpadServerLog/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/qw/qwIpadServerUser.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询ipad用户列表
+export function listQwIpadServerUser(query) {
+  return request({
+    url: '/qw/qwIpadServerUser/ipadServerUserList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询ipad用户详细
+export function getQwIpadServerUser(id) {
+  return request({
+    url: '/qw/qwIpadServerUser/' + id,
+    method: 'get'
+  })
+}
+
+// 新增ipad用户
+export function addQwIpadServerUser(data) {
+  return request({
+    url: '/qw/qwIpadServerUser',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改ipad用户
+export function updateQwIpadServerUser(data) {
+  return request({
+    url: '/qw/qwIpadServerUser',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除ipad用户
+export function delQwIpadServerUser(id) {
+  return request({
+    url: '/qw/qwIpadServerUser/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出ipad用户
+export function exportQwIpadServerUser(query) {
+  return request({
+    url: '/qw/qwIpadServerUser/export',
+    method: 'get',
+    params: query
+  })
+}

BIN
src/assets/logo/bjyjb.jpg


BIN
src/assets/logo/cqxzt.png


BIN
src/assets/logo/ylrz.png


+ 1 - 1
src/components/VideoUpload/index.vue

@@ -102,7 +102,7 @@
       </el-form>
 
       <!-- 视频列表 -->
-      <el-table v-loading="libraryLoading" :data="libraryList" @row-click="handleLibrarySelect" highlight-current-row>
+      <el-table v-loading="libraryLoading" :data="libraryList" @row-click="handleLibrarySelect" highlight-current-row border>
         <el-table-column label="素材名称" align="center" prop="resourceName" />
         <el-table-column label="文件名称" align="center" prop="fileName" />
         <el-table-column label="缩略图" align="center">

+ 4 - 3
src/views/components/course/userCourseCatalogDetails.vue

@@ -118,6 +118,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleComment(scope.row)"
+            v-hasPermi="['course:courseWatchComment:list']"
           >查看评论</el-button>
           <el-button
             size="mini"
@@ -145,9 +146,9 @@
         <el-form-item label="视频描述" prop="description">
           <el-input v-model="form.description" type="textarea" :rows="2"  placeholder="请输入内容" />
         </el-form-item>
-        <el-form-item label="轮次" prop="round">
-          <el-input v-model="form.round"  placeholder="请输入内容" />
-        </el-form-item>
+<!--        <el-form-item label="轮次" prop="round">-->
+<!--          <el-input v-model="form.round"  placeholder="请输入内容" />-->
+<!--        </el-form-item>-->
         <el-form-item label="课程排序" prop="courseSort">
           <el-input-number v-model="form.courseSort" :min="1" ></el-input-number>
         </el-form-item>

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

@@ -22,7 +22,7 @@
                      <el-button size="mini" @click="orderRefund()" v-hasPermi="['his:packageOrder:refund']">全部退款 </el-button>
                   </div> -->
 
-                  <div class="operate-button-container" v-if="item.status==2 &&item.packageSubType==1 && item.inquiryRefundStatus==0" >
+                  <div class="operate-button-container" v-if="item.status==2 &&item.packageSubType==1 && (item.inquiryRefundStatus==0 || item.inquiryRefundStatus == null)" >
                      <el-button size="mini" @click="inquiryOrderRefund()" v-hasPermi="['his:packageOrder:inquiryRefund']">问诊退款</el-button>
                   </div>
 

+ 17 - 2
src/views/course/courseWatchLog/index.vue

@@ -72,8 +72,23 @@
     <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="记录编号" align="center" prop="logId" />
-      <el-table-column label="用户账号" align="center" prop="userName" />
-      <el-table-column label="企微客户" align="center" prop="externalUserName" v-if="queryParams.sourceType == 2"/>
+      <el-table-column label="用户账号" align="center" prop="qwUserName" />
+      <el-table-column label="企微客户" align="center" prop="externalUserName">
+        <template slot-scope="scope">
+          <div style="display: flex;white-space: nowrap">
+            <div style="margin: auto">
+              {{scope.row.externalUserName}}
+            </div>
+            <el-popover
+              placement="right"
+              title=""
+              trigger="hover">
+              <img slot="reference" :src="scope.row.externalUserAvatar" style="width: 30px;height: 30px">
+              <img :src="scope.row.externalUserAvatar" style="max-width: 200px;max-height: 200px">
+            </el-popover>
+          </div>
+        </template>
+      </el-table-column>
       <el-table-column label="会员昵称" align="center" prop="fsNickName">
         <template slot-scope="scope">
           <div style="display: flex;white-space: nowrap">

+ 41 - 5
src/views/course/userCourseComplaintRecord/index.vue

@@ -1,15 +1,36 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="用户昵称" prop="nickName">
+      <el-form-item label="用户ID" prop="userId">
         <el-input
-          v-model="queryParams.nickName"
-          placeholder="请输入用户昵称"
+          v-model="queryParams.userId"
+          placeholder="请输入用户ID"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="投诉类型" prop="complaintTypeName">
+        <el-input
+          v-model="queryParams.complaintTypeName"
+          placeholder="请输入投诉类型"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="dateRange">
+        <el-date-picker
+          v-model="dateRange"
+          type="daterange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd"
+          style="width: 260px"
+          @change="handleDateRangeChange"
+        />
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -65,6 +86,7 @@
 
     <el-table border v-loading="loading" :data="userCourseComplaintRecordList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="用户ID" align="center" prop="userId" />
       <el-table-column label="用户昵称" align="center" prop="nickName" />
       <el-table-column label="投诉类型" align="center" prop="complaintTypeName" />
       <el-table-column label="所属课程" align="center" prop="courseName" />
@@ -189,12 +211,17 @@ export default {
       open: false,
       // 图片列表
       imageList: [],
+      // 日期范围
+      dateRange: [],
       // 查询参数
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        nickName: null,
-        // userId: null,
+        // nickName: null,
+        userId: null,
+        complaintTypeName: null,
+        startCreateTime: null,
+        endCreateTime: null,
         // complaintTypeId: null,
         // complaintContent: null,
         // courseId: null,
@@ -244,6 +271,15 @@ export default {
       this.imageList = [];
       this.resetForm("form");
     },
+    handleDateRangeChange(dates) {
+      if (dates) {
+        this.queryParams.startCreateTime = dates[0];
+        this.queryParams.endCreateTime = dates[1];
+      } else {
+        this.queryParams.startCreateTime = null;
+        this.queryParams.endCreateTime = null;
+      }
+    },
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.pageNum = 1;

+ 4 - 2
src/views/course/videoResource/index.vue

@@ -1047,10 +1047,12 @@ export default {
     //获取第一帧封面
     async getFirstThumbnail(file, form){
       try {
+        const uniqueFileName = `clipped_${Date.now()}_${Math.random().toString(36).slice(2, 8)}.mp4`;
+
         //截取小文件
         const clippedBlob = await this.clipVideoFirstTwoSeconds(file);
 
-        const clippedFile = new File([clippedBlob], 'clipped_video.mp4', {
+        const clippedFile = new File([clippedBlob], uniqueFileName, {
           type: 'video/mp4',
           lastModified: Date.now()
         });
@@ -1076,7 +1078,7 @@ export default {
         video.onloadedmetadata = async () => {
           try {
             // 计算截取时长
-            const duration = Math.min(1, video.duration);
+            const duration = Math.min(2, video.duration);
 
             // 直接从视频元素捕获流
             const stream = video.captureStream();

+ 3 - 1
src/views/his/package/index.vue

@@ -241,7 +241,9 @@
          </el-form-item>
         <el-form-item label="套餐包子类型" prop="packageSubType">
               <el-radio-group v-model="form.packageSubType">
-                <el-radio  label="1" v-if="form.packageType==1">咨询包</el-radio>
+                <el-tooltip content="咨询包不能推ERP" placement="top" :open-delay="100" v-if="form.packageType == 1">
+                  <el-radio label="1">咨询包</el-radio>
+                </el-tooltip>
                 <el-radio  label="2" v-if="form.packageType==1">治疗包</el-radio>
                 <el-radio  label="3" v-if="form.packageType==2">产品包</el-radio>
               </el-radio-group>

+ 383 - 0
src/views/his/physicalReportTemplate/index.vue

@@ -0,0 +1,383 @@
+<template>
+  <div class="app-container">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px">
+      <el-form-item label="模板名称" prop="templateName">
+        <el-input
+          v-model="queryParams.templateName"
+          clearable
+          placeholder="请输入体检模板名称"
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="状态" size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['his:physicalReportTemplate:add']"
+          icon="el-icon-plus"
+          plain
+          size="mini"
+          type="primary"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['his:physicalReportTemplate:edit']"
+          :disabled="single"
+          icon="el-icon-edit"
+          plain
+          size="mini"
+          type="success"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['his:physicalReportTemplate:remove']"
+          :disabled="multiple"
+          icon="el-icon-delete"
+          plain
+          size="mini"
+          type="danger"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['his:physicalReportTemplate:export']"
+          :loading="exportLoading"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExport"
+        >导出
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="fSPhysicalReportTemplateList" border @selection-change="handleSelectionChange">
+      <el-table-column align="center" type="selection" width="55"/>
+      <el-table-column align="center" label="模板编码" prop="id"/>
+      <el-table-column align="center" label="模板名称" prop="templateName"/>
+      <el-table-column align="center" label="备注" prop="remark"/>
+      <el-table-column align="center" label="状态" prop="status">
+        <template v-slot="scope">
+          <el-tag v-for="item in statusOptions" v-if="scope.row.status==item.dictValue" :key="item.dictValue"
+                  :type="scope.row.status==1?'success':'danger'"
+                  prop="status"
+          >{{ item.dictLabel }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+        <template v-slot="scope">
+          <el-button
+            v-hasPermi="['his:physicalReportTemplate:edit']"
+            icon="el-icon-edit"
+            size="mini"
+            type="text"
+            @click="handleUpdate(scope.row)"
+          >修改
+          </el-button>
+          <el-button
+            v-hasPermi="['his:physicalReportTemplate:remove']"
+            icon="el-icon-delete"
+            size="mini"
+            type="text"
+            @click="handleDelete(scope.row)"
+          >删除
+          </el-button>
+          <el-button
+            v-if="scope.row.status==='1'"
+            icon="el-icon-document-add"
+            size="mini"
+            type="text"
+            @click="customizeTemplate(scope.row)"
+          >自定义模板
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改体检报告模板对话框 -->
+    <el-dialog :title="title" :visible.sync="open" append-to-body width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="模板名称" prop="templateName">
+          <el-input v-model="form.templateName" placeholder="请输入体检模板名称"/>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入内容" type="textarea"/>
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="item in statusOptions"
+              :key="item.dictValue"
+              :label="item.dictValue"
+            >{{ item.dictLabel }}
+            </el-radio>
+          </el-radio-group>
+        </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
+      :before-close="handleClose"
+      :title="'自定义模板'+templateTitle"
+      :visible.sync="dialogVisible"
+      center
+      width="80%"
+    >
+      <customizeTemplate ref="customizeTemplate" :templateName="templateTitle"></customizeTemplate>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="dialogVisible = false">取 消</el-button>
+    <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listFSPhysicalReportTemplate,
+  getFSPhysicalReportTemplate,
+  delFSPhysicalReportTemplate,
+  addFSPhysicalReportTemplate,
+  updateFSPhysicalReportTemplate,
+  exportFSPhysicalReportTemplate
+} from '@/api/his/physicalReportTemplate'
+
+import customizeTemplate from '@/views/his/physicalReportTemplateField'
+
+export default {
+  name: 'FSPhysicalReportTemplate',
+  data() {
+    return {
+      //模板ID
+      templateId: null,
+      //弹窗名称
+      templateTitle: null,
+      dialogVisible: false,
+      //状态
+      statusOptions: [],
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 体检报告模板表格数据
+      fSPhysicalReportTemplateList: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        templateName: null,
+        status: null
+      },
+      // 表单参数
+      form: {
+        status: ''
+      },
+      // 表单校验
+      rules: {
+        templateName: [
+          { required: true, message: '体检模板名称不能为空', trigger: 'blur' }
+        ],
+        createTime: [
+          { required: true, message: '添加时间不能为空', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  components: {
+    customizeTemplate
+  },
+  created() {
+    this.getList()
+
+    //字典状态查询
+    this.getDicts('sys_company_status').then((response) => {
+      this.statusOptions = response.data
+    })
+  },
+  methods: {
+    /** 查询体检报告模板列表 */
+    getList() {
+      this.loading = true
+      listFSPhysicalReportTemplate(this.queryParams).then(response => {
+        this.fSPhysicalReportTemplateList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        templateName: null,
+        remark: null,
+        createTime: null,
+        updateTime: null,
+        status: 0,
+        createBy: null,
+        updateBy: null
+      }
+      this.resetForm('form')
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '添加体检报告模板'
+      this.form.status = '1'
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id || this.ids
+      getFSPhysicalReportTemplate(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = '修改体检报告模板'
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs['form'].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateFSPhysicalReportTemplate(this.form).then(response => {
+              this.msgSuccess('修改成功')
+              this.open = false
+              this.getList()
+            })
+          } else {
+            addFSPhysicalReportTemplate(this.form).then(response => {
+              this.msgSuccess('新增成功')
+              this.open = false
+              this.getList()
+            })
+          }
+        }
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids
+      this.$confirm('是否确认删除体检报告模板编号为"' + ids + '"的数据项?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(function() {
+        return delFSPhysicalReportTemplate(ids)
+      }).then(() => {
+        this.getList()
+        this.msgSuccess('删除成功')
+      }).catch(() => {
+      })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams
+      this.$confirm('是否确认导出所有体检报告模板数据项?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.exportLoading = true
+        return exportFSPhysicalReportTemplate(queryParams)
+      }).then(response => {
+        this.download(response.msg)
+        this.exportLoading = false
+      }).catch(() => {
+      })
+    },
+    /**
+     * 自定义模板
+     * **/
+    customizeTemplate(row) {
+      this.templateTitle = row.templateName
+      this.dialogVisible = true
+      this.$nextTick(() => {
+        this.$refs.customizeTemplate.getTemplateField(row.id)
+      })
+    },
+    handleClose(done) {
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done()
+        })
+        .catch(_ => {
+        })
+    }
+  }
+}
+</script>

+ 688 - 0
src/views/his/physicalReportTemplateField/index.vue

@@ -0,0 +1,688 @@
+<template>
+  <div class="form-builder">
+    <div>
+      <h2 class="template-title">{{ templateName }}</h2>
+    </div>
+    <el-row :gutter="20" class="main-container">
+      <el-col :span="5" class="field-selector">
+        <div class="panel-content">
+          <h3 class="panel-title">选择组件</h3>
+          <div class="field-list">
+            <div
+              v-for="(field, index) in availableFields"
+              :key="field.componentId"
+              class="field-item"
+              @click="addFieldToForm(field, index)"
+            >
+              <el-button size="small">{{ field.label }}</el-button>
+            </div>
+          </div>
+        </div>
+      </el-col>
+
+      <el-col :span="14" class="form-preview">
+        <template v-if="formFields.length === 0">
+          <div class="empty-tip">请选择添加左侧样式</div>
+        </template>
+        <draggable
+          v-model="formFields"
+          200 animation:
+          group="form-fields"
+          @end="handleDragEnd"
+        >
+          <el-scrollbar style="height: 500px; width: 100%;">
+            <div
+              v-for="(field, index) in formFields"
+              :key="index"
+              :class="{ 'form-field-active': activeFieldIndex === index }"
+              class="form-field-item"
+              @click="setActiveField(index)"
+            >
+              <div class="field-header">
+                <el-row align="middle" type="flex">
+                  <el-col :span="23" class="field-label">
+                    <span v-if="field.required" class="required-mark">*</span>
+                    {{ field.label }}
+                  </el-col>
+                  <el-col :span="1" class="field-operation">
+                    <i
+                      v-if="activeFieldIndex === index"
+                      class="el-icon-delete"
+                      @click.stop="removeFormField(index)"
+                    ></i>
+                  </el-col>
+                </el-row>
+              </div>
+
+              <!-- 字段输入组件 -->
+              <div class="field-input">
+                <!-- 单选框 -->
+                <template v-if="field.type === 'radio'">
+                  <el-radio-group v-model="field.value">
+                    <el-radio
+                      v-for="(option, optIdx) in field.options"
+                      :key="optIdx"
+                      :label="option"
+                      style="width: 90px"
+                    >
+                      {{ option }}
+                    </el-radio>
+                  </el-radio-group>
+                </template>
+
+                <!-- 下拉选择框 -->
+                <template v-else-if="field.type === 'select'">
+                  <el-select
+                    v-if="!field.multiple"
+                    v-model="field.value"
+                    :multiple="field.multiple"
+                    :placeholder="`请选择${field.label}`"
+                    clearable
+                    size="small"
+                    style="width: 100%"
+                  >
+                    <el-option
+                      v-for="(option, optIdx) in field.options"
+                      :key="optIdx"
+                      :label="option"
+                      :value="optIdx"
+                    ></el-option>
+                  </el-select>
+
+                  <el-select
+                    v-if="field.multiple"
+                    v-model="field.multiples"
+                    :multiple="field.multiple"
+                    :placeholder="`请选择${field.label}`"
+                    clearable
+                    size="small"
+                    style="width: 100%"
+                  >
+                    <el-option
+                      v-for="(option, optIdx) in field.options"
+                      :key="optIdx"
+                      :label="option"
+                      :value="optIdx"
+                    ></el-option>
+                  </el-select>
+                </template>
+
+                <!-- 文本输入框 -->
+                <template v-else-if="field.type === 'text'">
+                  <el-input
+                    v-model="field.value"
+                    :placeholder="field.placeholder || `请输入${field.label}`"
+                    clearable
+                    size="small"
+                  ></el-input>
+                </template>
+
+                <!-- 复选框 -->
+                <template v-else-if="field.type === 'checkbox'">
+                  <div class="option-container">
+                    <el-checkbox-group v-model="field.multiples">
+                      <el-checkbox
+                        v-for="(option, optIdx) in field.options"
+                        :key="optIdx"
+                        :label="optIdx"
+                        style="width: 90px"
+                      >{{ option }}
+                      </el-checkbox>
+                    </el-checkbox-group>
+                  </div>
+                </template>
+
+              </div>
+            </div>
+          </el-scrollbar>
+        </draggable>
+      </el-col>
+
+
+      <el-col :span="5" class="field-configurator">
+        <template v-if="formFields.length > 0">
+          <el-form class="config-form">
+            <!-- 字段名称配置 -->
+            <el-form-item label="字段名称">
+              <el-input
+                v-model="formFields[activeFieldIndex].label"
+                clearable
+                size="small"
+              ></el-input>
+            </el-form-item>
+
+            <!--            <template v-if="formFields[activeFieldIndex].type !== 'radio' && formFields[activeFieldIndex].type !== 'checkbox'">-->
+            <!--              <el-form-item label="默认值">-->
+            <!--                <el-select-->
+            <!--                  v-model="defaultValueMode"-->
+            <!--                  size="small"-->
+            <!--                  style="width: 100%; margin-bottom: 8px"-->
+            <!--                >-->
+            <!--                  <el-option-->
+            <!--                    v-for="mode in valueModes"-->
+            <!--                    :key="mode.value"-->
+            <!--                    :label="mode.label"-->
+            <!--                    :value="mode.value"-->
+            <!--                  ></el-option>-->
+            <!--                </el-select>-->
+            <!--                <el-input-->
+            <!--                  :v-model="formFields[activeFieldIndex].value"-->
+            <!--                  clearable-->
+            <!--                  placeholder="请输入默认值"-->
+            <!--                  size="small"-->
+            <!--                ></el-input>-->
+            <!--              </el-form-item>-->
+            <!--            </template>-->
+
+            <template v-if="['radio', 'select','checkbox'].includes(formFields[activeFieldIndex].type)">
+              <el-form-item label="选项配置">
+                <draggable
+                  v-model="formFields[activeFieldIndex].options"
+                  animation:50
+                  group="options"
+                  @end="handleOptionDragEnd"
+                >
+                  <el-row
+                    v-for="(option, idx) in formFields[activeFieldIndex].options"
+                    :key="idx"
+                    class="option-item"
+                  >
+                    <el-col :span="2" class="option-drag">
+                      <span class="el-icon-s-operation"></span>
+                    </el-col>
+                    <el-col :span="18">
+                      <el-input
+                        v-model="formFields[activeFieldIndex].options[idx]"
+                        clearable
+                        size="small"
+                      ></el-input>
+                    </el-col>
+                    <el-col :span="2" class="option-delete">
+                      <i
+                        class="el-icon-delete"
+                        @click.stop="removeOption(idx)"
+                      ></i>
+                    </el-col>
+                  </el-row>
+                </draggable>
+                <el-button
+                  size="small"
+                  style="width: 100%; margin-top: 8px"
+                  @click="addNewOption"
+                >
+                  <span class="el-icon-plus"></span> 添加选项
+                </el-button>
+              </el-form-item>
+            </template>
+
+            <!-- 通用配置:是否必填 -->
+            <el-form-item class="required-config" label="是否必填">
+              <el-switch v-model="formFields[activeFieldIndex].required"></el-switch>
+            </el-form-item>
+
+            <el-form-item v-if="'select' === formFields[activeFieldIndex].type" class="required-config"
+                          label="是否多选"
+            >
+              <el-switch v-model="formFields[activeFieldIndex].multiple"></el-switch>
+            </el-form-item>
+
+            <!-- 文本字段:长度限制 -->
+            <el-form-item
+              v-if="formFields[activeFieldIndex].type === 'text' && formFields[activeFieldIndex].required"
+              class="length-limit"
+              label="长度限制"
+            >
+              <el-input
+                v-model.number="formFields[activeFieldIndex].minLength"
+                autocomplete="off"
+                clearable
+                placeholder="最小"
+                size="small"
+                style="width: 40%; display: inline-block"
+              ></el-input>
+              <span style="margin: 0 4px">-</span>
+              <el-input
+                v-model.number="formFields[activeFieldIndex].maxLength"
+                autocomplete="off"
+                clearable
+                placeholder="最大"
+                size="small"
+                style="width: 40%; display: inline-block"
+              ></el-input>
+            </el-form-item>
+          </el-form>
+        </template>
+      </el-col>
+    </el-row>
+
+    <el-row class="action-bar">
+      <el-button size="small" @click="resetForm">重置</el-button>
+      <el-button size="small" type="primary" @click="submitForm">保存配置</el-button>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import draggable from 'vuedraggable'
+import { getTemplateField, saveTemplate } from '@/api/his/physicalReportTemplateField'
+
+export default {
+  props: {
+    templateName: {
+      type: String,
+      default: '体检报告',
+      required: true
+    }
+  },
+  components: { draggable },
+  data() {
+    return {
+      templateId: null,
+      availableFields: [
+        { componentId: '1', label: '输入框', type: 'text' },
+        { componentId: '2', label: '单选按钮', type: 'radio' },
+        { componentId: '3', label: '下拉选项', type: 'select' },
+        { componentId: '4', label: '复选框', type: 'checkbox' }
+      ],
+
+      // 中间表单已添加的字段列表
+      formFields: [],
+
+      // 当前激活的字段索引
+      activeFieldIndex: 0,
+
+      // 右侧配置:默认值模式
+      defaultValueMode: 1,
+
+      // 临时存储:默认值模式(用于非单选/下拉字段)
+      valueModes: [{ label: '自定义输入', value: 1 }]
+    }
+  },
+  created() {
+
+  },
+  computed: {
+    // 当前激活字段的类型
+    currentFieldType() {
+      return this.formFields[this.activeFieldIndex]?.type
+    }
+  },
+  methods: {
+    // 添加字段到表单
+    addFieldToForm(field, index) {
+      // 检查字段是否已添加(避免重复)
+      // const isExist = this.formFields.some(item => item.id === field.id)
+      // if (isExist) return
+      // 根据字段类型初始化配置
+      const fieldConfig = {
+        componentId: field.componentId,
+        label: field.label,
+        type: field.type,
+        required: false,
+        value: '',
+        multiple: false,
+        multiples: [],
+        placeholder: ''
+      }
+
+      // 文本字段
+      if (field.type === 'text') {
+        fieldConfig.minLength = null
+        fieldConfig.maxLength = null
+      }
+
+      // 单选/下拉字段
+      if (['radio', 'select', 'checkbox'].includes(field.type)) {
+        fieldConfig.options = ['选项1', '选项2']
+      }
+
+      this.formFields.push(fieldConfig)
+      this.activeFieldIndex = this.formFields.length - 1
+    },
+
+    // 删除表单中的字段
+    removeFormField(index) {
+      this.formFields.splice(index, 1)
+      if (this.activeFieldIndex === index) {
+        this.activeFieldIndex = Math.min(index, this.formFields.length - 1)
+      }
+    },
+
+    // 添加新选项
+    addNewOption() {
+      const currentField = this.formFields[this.activeFieldIndex]
+      const optionCount = currentField.options.length + 1
+      currentField.options.push(`选项${optionCount}`)
+    },
+
+    // 删除选项
+    removeOption(index) {
+      this.formFields[this.activeFieldIndex].options.splice(index, 1)
+    },
+
+    // 设置当前激活的字段
+    setActiveField(index) {
+      this.activeFieldIndex = index
+    },
+
+    // 拖拽结束事件
+    handleDragEnd() {
+      console.log('字段排序已更新----')
+    },
+
+    // 拖拽结束事件
+    handleOptionDragEnd() {
+      console.log('选项排序已更新----')
+    },
+
+    // 表单验证
+    validateForm() {
+      if (this.formFields.length === 0) {
+        this.$message.error('请至少添加一个字段')
+        return false
+      }
+
+      for (let i = 0; i < this.formFields.length; i++) {
+        const field = this.formFields[i]
+        if (!field.label.trim()) {
+          this.activeFieldIndex = i
+          this.$message.error('字段名称不能为空')
+          return false
+        }
+
+        // // 验证必填字段
+        // if (field.required && field.type !== 'checkbox' && !field.multiple && !field.value && field.value !== 0 || field.required && field.type === 'checkbox' && field.options.length === 0) {
+        //   this.activeFieldIndex = i
+        //   this.$message.error(`“${field.label}”为必填项,请补充`)
+        //   return false
+        // }
+        //
+        // // 验证文本字段长度限制
+        // if (field.type === 'text' && field.required) {
+        //   const valueLength = (field.value || '').length
+        //   if (field.minLength !== null && valueLength < field.minLength) {
+        //     this.$message.error(`“${field.label}”长度不能小于${field.minLength}个字符`)
+        //     return false
+        //   }
+        //   if (field.maxLength !== null && valueLength > field.maxLength) {
+        //     this.$message.error(`“${field.label}”长度不能大于${field.maxLength}个字符`)
+        //     return false
+        //   }
+        // }
+      }
+
+      return true
+    },
+
+    // 提交表单配置
+    submitForm() {
+      if (!this.validateForm()) return
+      // 数据过滤
+      const formData = this.formFields.map(field => {
+        const multiple = field.multiple ? 1 : 0
+        const required = field.required ? 1 : 0
+        const {
+          componentId,
+          label,
+          type,
+          value,
+          options,
+          maxLength,
+          minLength
+        } = field
+
+        const result = {
+          componentId,
+          label,
+          type,
+          required,
+          value,
+          maxLength,
+          minLength,
+          multiple
+        }
+        if (options) {
+          result.options = options.join(',')
+        }
+        return result
+      })
+
+      saveTemplate({ templateId: this.templateId, templateFieldList: formData }).then(response => {
+        if (response.code === 200) {
+          this.$message.success('保存成功!')
+        }
+        this.getTemplateField(this.templateId)
+      })
+    },
+
+    // 重置表单
+    resetForm() {
+      this.formFields = []
+      this.activeFieldIndex = 0
+      this.$message.info('已重置表单配置')
+    },
+    /**
+     * 获取自定义数据列表
+     * **/
+    getTemplateField(templateId) {
+      this.templateId = templateId
+
+      getTemplateField(templateId).then(response => {
+        if (response.data.length > 0) {
+          //处理数据处理
+          this.formFields = response.data.map(item => {
+            const multiple = item.multiple === 1
+            const required = item.required === 1
+            const multiples = []
+            const {
+              componentId,
+              label,
+              type,
+              value,
+              options,
+              maxLength,
+              minLength
+            } = item
+
+            const result = {
+              componentId,
+              label,
+              type,
+              required,
+              value,
+              maxLength,
+              minLength,
+              multiple,
+              multiples
+            }
+
+            if (options) {
+              result.options = options.split(',').map(item => item.trim())
+            }
+            return result
+          })
+          this.activeFieldIndex = this.formFields.length - 1
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.form-builder {
+  padding: 15px;
+  background-color: #f5f7fa;
+  min-height: calc(94vh - 30px);
+}
+
+.main-container {
+  margin-bottom: 20px;
+}
+
+.field-selector {
+  background-color: #fff;
+  border-radius: 6px;
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  padding: 15px !important;
+}
+
+.panel-title {
+  font-size: 15px;
+  color: #1f2329;
+  margin: 0 0 15px;
+  padding-left: 4px;
+  font-weight: 500;
+}
+
+.field-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+
+.field-item {
+  width: 100px;
+  box-sizing: border-box;
+}
+
+.field-item .el-button {
+  width: 100%;
+}
+
+/* 中间表单预览区 */
+.form-preview {
+  padding: 0 10px !important;
+}
+
+.empty-tip {
+  height: 60px;
+  line-height: 60px;
+  text-align: center;
+  border: 1px dashed #dcdfe6;
+  color: #8c8c8c;
+  border-radius: 6px;
+  margin-top: 10px;
+}
+
+.form-field-item {
+  background-color: #fff;
+  border: 1px solid #e5e6eb;
+  border-radius: 6px;
+  padding: 12px 15px;
+  margin-bottom: 12px;
+  transition: all 0.2s;
+}
+
+.form-field-item:hover {
+  border-color: #c0c4cc;
+}
+
+.form-field-active {
+  border-color: #409eff;
+  background-color: #f0f7ff;
+}
+
+.field-header {
+  margin-bottom: 10px;
+}
+
+.field-label {
+  font-size: 14px;
+  color: #1f2329;
+}
+
+.required-mark {
+  color: #ff4d4f;
+  margin-right: 4px;
+}
+
+.field-operation {
+  color: #8c8c8c;
+  cursor: pointer;
+}
+
+.field-operation:hover {
+  color: #ff4d4f;
+}
+
+.field-configurator {
+  background-color: #fff;
+  border-radius: 6px;
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  padding: 15px !important;
+}
+
+.config-form .el-form-item {
+  margin-bottom: 12px;
+}
+
+.config-form .el-form-item__label {
+  font-size: 13px;
+  color: #4e5969;
+  padding: 0 0 6px;
+  line-height: 1;
+  width: 100%;
+  text-align: left;
+}
+
+.option-item {
+  display: flex;
+  align-items: center;
+  width: 100%;
+  margin: 0 !important;
+  padding: 4px 0;
+}
+
+.option-drag {
+  color: #c9cdD4;
+}
+
+.option-delete {
+  color: #8c8c8c;
+  cursor: pointer;
+}
+
+.option-delete:hover {
+  color: #ff4d4f;
+}
+
+.action-bar {
+  text-align: center;
+  padding: 10px 0;
+}
+
+.action-bar .el-button {
+  margin: 0 5px;
+}
+
+.empty-tip {
+  height: 60px;
+  line-height: 60px;
+  text-align: center;
+  border: 1px dashed #dcdfe6;
+  color: #8c8c8c;
+  border-radius: 6px;
+  margin-top: 10px;
+}
+
+@media (max-width: 1200px) {
+  .field-selector,
+  .field-configurator {
+    padding: 10px !important;
+  }
+}
+
+.option-container {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: flex-start;
+  gap: 16px;
+}
+
+.template-title {
+  text-align: center;
+  margin: 0;
+  line-height: 50px;
+}
+</style>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 766 - 47
src/views/his/storeOrder/order1.vue


+ 7 - 3
src/views/his/storeProduct/index.vue

@@ -320,6 +320,11 @@
                              <el-input v-model="form.prescribeSpec" placeholder="请输入规格" />
                      </el-form-item>
               </el-col>
+              <el-col :span="12">
+                <el-form-item label="品牌">
+                  <el-input v-model="form.brand" placeholder="请输入品牌" />
+                </el-form-item>
+              </el-col>
             </el-row>
             <el-form-item label="是否药品" prop="isDrug">
                       <el-radio-group v-model="form.isDrug">
@@ -840,8 +845,7 @@ export default {
        ],
       isDrug: [
          { required: true, message: "不能为空", trigger: "blur" }
-       ], 
-       
+       ],
       }
     };
   },
@@ -1260,7 +1264,7 @@ export default {
 
           addOrEdit(this.form).then(response => {
             if (response.code === 200) {
-              this.msgSuccess("修改成功");
+              this.msgSuccess("操作成功");
               this.open = false;
               this.getList();
             }

+ 5 - 2
src/views/his/storeProductCategory/index.vue

@@ -268,8 +268,11 @@ export default {
     },
     handleAvatarSuccess(res, file) {
         if(res.code==200){
-          this.form.imgUrl=res.url;
-          self.$forceUpdate()
+          // this.form.imgUrl=res.url;
+          
+          this.form.pic=res.url;
+         
+          this.$forceUpdate()
         }
         else{
           this.msgError(res.msg);

+ 5 - 5
src/views/his/user/userBehavior.vue

@@ -13,9 +13,9 @@
         >
           <el-option
             v-for="item in typeList"
-            :key="item.dictValue"
-            :label="item.dictLabel"
-            :value="item.dictLabel"
+            :key="item"
+            :label="item"
+            :value="item"
           ></el-option>
         </el-select>
       </div>
@@ -143,7 +143,7 @@
 </template>
 
 <script>
-import { listUserOperationLog} from "@/api/his/userOperationLog";
+import { listUserOperationLog,getOperationType} from "@/api/his/userOperationLog";
 
 export default {
   data() {
@@ -163,7 +163,7 @@ export default {
     };
   },
   created() {
-    this.getDicts("fs_user_operation_type").then(response => {
+    getOperationType().then(response => {
       this.typeList = response.data;
     });
   },

+ 358 - 0
src/views/qw/qwIpadServer/index.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="标题" prop="title">
+        <el-input
+          v-model="queryParams.title"
+          placeholder="请输入标题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="地址" prop="addressId">
+        <el-input
+          v-model="queryParams.addressId"
+          placeholder="请输入地址"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="ip" prop="ip">
+        <el-input
+          v-model="queryParams.ip"
+          placeholder="请输入ip"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!-- <el-form-item label="地址" prop="port">
+        <el-input
+          v-model="queryParams.port"
+          placeholder="请输入地址"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item> -->
+      <el-form-item label="url" prop="url">
+        <el-input
+          v-model="queryParams.url"
+          placeholder="请输入url"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!-- <el-form-item label="总数" prop="totalCount">
+        <el-input
+          v-model="queryParams.totalCount"
+          placeholder="请输入总数"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="剩余数量" prop="count">
+        <el-input
+          v-model="queryParams.count"
+          placeholder="请输入剩余数量"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item> -->
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['qw:qwIpadServer:add']"
+        >新增</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['qw:qwIpadServer:edit']"
+        >修改</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="['qw:qwIpadServer:remove']"
+        >删除</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['qw:qwIpadServer:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="qwIpadServerList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column width="100px" label="id" align="center" prop="id" />
+      <el-table-column label="标题" align="center" prop="title" />
+      <el-table-column label="地址" align="center" prop="addressId" />
+      <el-table-column label="ip" align="center" prop="ip" />
+      <el-table-column width="100px" label="端口" align="center" prop="port" />
+      <el-table-column label="url" align="center" prop="url" />
+      <el-table-column label="总数" align="center" prop="totalCount" />
+      <el-table-column label="剩余数量" align="center" prop="count" />
+      <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['qw:qwIpadServer:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['qw:qwIpadServer:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column> -->
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改ipad服务器对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" 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-form-item>
+        <el-form-item label="地址" prop="addressId">
+          <el-input v-model="form.addressId" placeholder="请输入地址" />
+        </el-form-item>
+        <el-form-item label="ip" prop="ip">
+          <el-input v-model="form.ip" placeholder="请输入ip" />
+        </el-form-item>
+        <el-form-item label="端口" prop="port">
+          <el-input v-model="form.port" placeholder="请输入地址" />
+        </el-form-item>
+        <el-form-item label="url" prop="url">
+          <el-input v-model="form.url" placeholder="请输入url" />
+        </el-form-item>
+        <el-form-item label="总数" prop="totalCount">
+          <el-input v-model="form.totalCount" placeholder="请输入总数" />
+        </el-form-item>
+        <el-form-item label="剩余数量" prop="count">
+          <el-input v-model="form.count" 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>
+  </div>
+</template>
+
+<script>
+import { listQwIpadServer, getQwIpadServer, delQwIpadServer, addQwIpadServer, updateQwIpadServer, exportQwIpadServer } from "@/api/qw/qwIpadServer";
+
+export default {
+  name: "QwIpadServer",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // ipad服务器表格数据
+      qwIpadServerList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: null,
+        addressId: null,
+        ip: null,
+        port: null,
+        url: null,
+        totalCount: null,
+        count: null,
+        groupNo: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询ipad服务器列表 */
+    getList() {
+      this.loading = true;
+      listQwIpadServer(this.queryParams).then(response => {
+        this.qwIpadServerList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        title: null,
+        addressId: null,
+        ip: null,
+        port: null,
+        url: null,
+        totalCount: null,
+        count: null,
+        createTime: null,
+        updateTime: null,
+        groupNo: null,
+        createBy: null,
+        updateBy: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加ipad服务器";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getQwIpadServer(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改ipad服务器";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateQwIpadServer(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addQwIpadServer(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除ipad服务器编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delQwIpadServer(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有ipad服务器数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportQwIpadServer(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 342 - 0
src/views/qw/qwIpadServerLog/index.vue

@@ -0,0 +1,342 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="服务器" prop="serverName">
+        <el-input
+          v-model="queryParams.serverName"
+          placeholder="请输入服务器"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="企微用户" prop="qwUserName">
+        <el-input
+          v-model="queryParams.qwUserName"
+          placeholder="请输入企微用户"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="公司" prop="companyName">
+        <el-input
+          v-model="queryParams.companyName"
+          placeholder="请输入公司"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="公司用户" prop="companyUserName">
+        <el-input
+          v-model="queryParams.companyUserName"
+          placeholder="请输入公司用户"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!-- <el-form-item label="标题" prop="tilie">
+        <el-input
+          v-model="queryParams.tilie"
+          placeholder="请输入标题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item> -->
+      <el-form-item label="类别" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择类别" clearable size="small">
+          <el-option label="绑定" value="1" />
+          <el-option label="解绑" value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['qw:qwIpadServerLog:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['qw:qwIpadServerLog:edit']"
+        >修改</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="['qw:qwIpadServerLog:remove']"
+        >删除</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['qw:qwIpadServerLog:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="qwIpadServerLogList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="服务器" align="center" prop="serverName" />
+      <el-table-column label="企微用户" align="center" prop="qwUserName" />
+      <el-table-column label="公司" align="center" prop="companyName" />
+      <el-table-column label="公司用户" align="center" prop="companyUserName" />
+      <el-table-column label="标题" align="center" prop="tilie" />
+      <el-table-column label="类别" align="center" prop="type" >
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.type == 1" type="success">绑定</el-tag>
+          <el-tag v-if="scope.row.type == 2" type="danger">解绑</el-tag>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['qw:qwIpadServerLog:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['qw:qwIpadServerLog:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column> -->
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改ipad服务器日志对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="服务器id" prop="serverId">
+          <el-input v-model="form.serverId" placeholder="请输入服务器id" />
+        </el-form-item>
+        <el-form-item label="企微用户" prop="qwUserId">
+          <el-input v-model="form.qwUserId" placeholder="请输入企微用户" />
+        </el-form-item>
+        <el-form-item label="公司id" prop="companyId">
+          <el-input v-model="form.companyId" placeholder="请输入公司id" />
+        </el-form-item>
+        <el-form-item label="公司用户id" prop="companyUserId">
+          <el-input v-model="form.companyUserId" placeholder="请输入公司用户id" />
+        </el-form-item>
+        <el-form-item label="标题" prop="tilie">
+          <el-input v-model="form.tilie" placeholder="请输入标题" />
+        </el-form-item>
+        <el-form-item label="类别 1 绑定 2 解绑" prop="type">
+          <el-select v-model="form.type" placeholder="请选择类别 1 绑定 2 解绑">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </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>
+  </div>
+</template>
+
+<script>
+import { listQwIpadServerLog, getQwIpadServerLog, delQwIpadServerLog, addQwIpadServerLog, updateQwIpadServerLog, exportQwIpadServerLog } from "@/api/qw/qwIpadServerLog";
+
+export default {
+  name: "QwIpadServerLog",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // ipad服务器日志表格数据
+      qwIpadServerLogList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        serverName: null,
+        qwUserName: null,
+        companyName: null,
+        companyUserName: null,
+        tilie: null,
+        type: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询ipad服务器日志列表 */
+    getList() {
+      this.loading = true;
+      listQwIpadServerLog(this.queryParams).then(response => {
+        this.qwIpadServerLogList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        serverName: null,
+        qwUserName: null,
+        companyName: null,
+        companyUserName: null,
+        tilie: null,
+        type: null,
+        createTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加ipad服务器日志";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getQwIpadServerLog(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改ipad服务器日志";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateQwIpadServerLog(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addQwIpadServerLog(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除ipad服务器日志编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delQwIpadServerLog(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有ipad服务器日志数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportQwIpadServerLog(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 308 - 0
src/views/qw/qwIpadServerUser/index.vue

@@ -0,0 +1,308 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="服务器" prop="serverName">
+        <el-input
+          v-model="queryParams.serverName"
+          placeholder="请输入服务器"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="企微用户" prop="qwUserName">
+        <el-input
+          v-model="queryParams.qwUserName"
+          placeholder="请输入企微用户"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="公司" prop="companyName">
+        <el-input
+          v-model="queryParams.companyName"
+          placeholder="请输入公司"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="公司用户" prop="companyUserName">
+        <el-input
+          v-model="queryParams.companyUserName"
+          placeholder="请输入公司用户"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['qw:qwIpadServerUser:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['qw:qwIpadServerUser:edit']"
+        >修改</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="['qw:qwIpadServerUser:remove']"
+        >删除</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['qw:qwIpadServerUser:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="qwIpadServerUserList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="服务器" align="center" prop="serverName" />
+      <el-table-column label="企微用户" align="center" prop="qwUserName" />
+      <el-table-column label="公司" align="center" prop="companyName" />
+      <el-table-column label="公司用户" align="center" prop="companyUserName" />
+      <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['qw:qwIpadServerUser:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['qw:qwIpadServerUser:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column> -->
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改ipad用户对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="服务器id" prop="serverId">
+          <el-input v-model="form.serverId" placeholder="请输入服务器id" />
+        </el-form-item>
+        <el-form-item label="企微用户id" prop="qwUserId">
+          <el-input v-model="form.qwUserId" placeholder="请输入企微用户id" />
+        </el-form-item>
+        <el-form-item label="公司id" prop="companyId">
+          <el-input v-model="form.companyId" placeholder="请输入公司id" />
+        </el-form-item>
+        <el-form-item label="公司用户id" prop="companyUserId">
+          <el-input v-model="form.companyUserId" placeholder="请输入公司用户id" />
+        </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>
+  </div>
+</template>
+
+<script>
+import { listQwIpadServerUser, getQwIpadServerUser, delQwIpadServerUser, addQwIpadServerUser, updateQwIpadServerUser, exportQwIpadServerUser } from "@/api/qw/qwIpadServerUser";
+
+export default {
+  name: "QwIpadServerUser",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // ipad用户表格数据
+      qwIpadServerUserList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        serverName: null,
+        qwUserName: null,
+        companyName: null,
+        companyUserName: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询ipad用户列表 */
+    getList() {
+      this.loading = true;
+      listQwIpadServerUser(this.queryParams).then(response => {
+        this.qwIpadServerUserList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        serverName: null,
+        qwUserName: null,
+        companyName: null,
+        companyUserName: null,
+        createTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加ipad用户";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getQwIpadServerUser(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改ipad用户";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateQwIpadServerUser(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addQwIpadServerUser(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除ipad用户编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delQwIpadServerUser(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有ipad用户数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportQwIpadServerUser(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 19 - 7
src/views/statistics/section/channel.vue

@@ -83,13 +83,25 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 18 - 7
src/views/statistics/section/index.vue

@@ -67,13 +67,24 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 18 - 7
src/views/statistics/section/inline.vue

@@ -47,13 +47,24 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 19 - 7
src/views/statistics/section/today.vue

@@ -83,13 +83,25 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 214 - 6
src/views/system/config/config.vue

@@ -720,6 +720,8 @@
         <el-radio v-model="form13.erpType" label=1>管易</el-radio>
         <el-radio v-model="form13.erpType" label=2>旺店通</el-radio>
         <el-radio v-model="form13.erpType" label=3>瀚智OMS</el-radio>
+        <el-radio v-model="form13.erpType" label=4>代服管家</el-radio>
+        <el-radio v-model="form13.erpType" label=5>聚水潭</el-radio>
       </el-form-item>
       <el-form-item   label="erpAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpAppKey">
           <el-input   v-model="form13.erpAppKey"  label="请输入erpAppKey"></el-input>
@@ -736,6 +738,98 @@
       <el-form-item   label="erpShopCode" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpShopCode">
           <el-input   v-model="form13.erpShopCode"  label="请输入erpShopCode"></el-input>
       </el-form-item>
+      <el-form-item   label="erpWdAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdAppKey">
+        <el-input   v-model="form13.erpWdAppKey"  label="请输入erpAppKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdAppsecret" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdAppsecret">
+        <el-input   v-model="form13.erpWdAppsecret"  label="erpWdAppsecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdSid" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdSid">
+        <el-input   v-model="form13.erpWdSid"  label="请输入erpWdSid"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdShopCode" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdShopCode">
+        <el-input   v-model="form13.erpWdShopCode"  label="请输入erpWdShopCode"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdBaseUrl" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdBaseUrl">
+        <el-input   v-model="form13.erpWdBaseUrl"  label="请输入erpWdBaseUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWarehouseCode" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWarehouseCode">
+        <el-input   v-model="form13.erpWarehouseCode"  label="请输入erpWarehouseCode"></el-input>
+      </el-form-item>
+      <!-- erpHzOMSid -->
+      <el-form-item   label="erpHzOMSAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMSAppKey">
+        <el-input   v-model="form13.erpHzOMSAppKey"  label="请输入erpAppKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMSAppsecret" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMSAppsecret">
+        <el-input   v-model="form13.erpHzOMSAppsecret"  label="erpWdAppsecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMSItenantid" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMSItenantid">
+        <el-input   v-model="form13.erpHzOMSItenantid"  label="请输入erpHzOMSItenantid"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMTokenUrl" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMTokenUrl">
+        <el-input   v-model="form13.erpHzOMTokenUrl"  label="请输入erpHzOMTokenUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMBaseUrl" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMBaseUrl">
+        <el-input   v-model="form13.erpHzOMBaseUrl"  label="请输入erpHzOMBaseUrl"></el-input>
+      </el-form-item>
+
+      <!-- 代付管家 - 修改为支持多账户 -->
+      <div v-if="form13.erpOpen == 1 && form13.erpType == 4">
+        <el-form-item label="代付管家账户配置">
+          <el-button type="primary" icon="el-icon-plus" @click="addDfAccount" style="margin-bottom: 10px;">添加新账号</el-button>
+        </el-form-item>
+
+        <div v-for="(account, index) in form13.dfAccounts" :key="index" style="border: 1px solid #dcdfe6; padding: 20px; margin-bottom: 20px; border-radius: 4px;">
+          <div style="display: flex; justify-content: between; align-items: center; margin-bottom: 15px;">
+            <div style="margin: 0; color: #409eff;">账户 {{ index + 1 }}</div>
+            <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              @click="removeDfAccount(index)"
+              v-if="form13.dfAccounts.length > 1">
+              删除账户
+            </el-button>
+          </div>
+
+          <el-form-item label="dfAppKey" :prop="`dfAccounts.${index}.dfAppKey`">
+            <el-input v-model="account.dfAppKey" placeholder="请输入dfAppKey"></el-input>
+          </el-form-item>
+          <el-form-item label="dfAppsecret" :prop="`dfAccounts.${index}.dfAppsecret`">
+            <el-input v-model="account.dfAppsecret" placeholder="请输入dfAppsecret"></el-input>
+          </el-form-item>
+          <el-form-item label="登录账号" :prop="`dfAccounts.${index}.loginAccount`">
+            <el-input v-model="account.loginAccount" placeholder="登录账号"></el-input>
+          </el-form-item>
+          <el-form-item label="回调地址" :prop="`dfAccounts.${index}.callBackUrl`">
+            <el-input v-model="account.callBackUrl" placeholder="回调地址"></el-input>
+          </el-form-item>
+          <el-form-item label="月结账号" :prop="`dfAccounts.${index}.monthlyCard`">
+            <el-input v-model="account.monthlyCard" placeholder="月结账号"></el-input>
+          </el-form-item>
+          <el-form-item label="物流产品编码" :prop="`dfAccounts.${index}.expressProductCode`">
+            <el-input v-model="account.expressProductCode" placeholder="物流产品编码:1-顺丰标快,2-顺丰标快(陆运),204-陆运微小件,231-陆运包裹,208-特惠专配,247-电商标快"></el-input>
+          </el-form-item>
+          <el-form-item label="寄件人姓名" :prop="`dfAccounts.${index}.senderName`">
+            <el-input v-model="account.senderName" placeholder="寄件人姓名"></el-input>
+          </el-form-item>
+          <el-form-item label="寄件人手机" :prop="`dfAccounts.${index}.senderPhone`">
+            <el-input v-model="account.senderPhone" placeholder="寄件人手机"></el-input>
+          </el-form-item>
+          <el-form-item label="寄件人省市区" prop="`cityIds`">
+               <el-cascader
+                         ref="citySelect"
+                         v-model="account.cityIds"
+                         :options="citys"
+                         @change="handleCityChange(index)">
+                         </el-cascader>
+               </el-form-item>
+          <el-form-item label="寄件人详细地址" :prop="`dfAccounts.${index}.senderAddress`">
+            <el-input v-model="account.senderAddress" placeholder="寄件人详细地址"></el-input>
+          </el-form-item>
+        </div>
+      </div>
+
 
           <el-form-item   label="erpWdAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdAppKey">
             <el-input   v-model="form13.erpWdAppKey"  label="请输入erpAppKey"></el-input>
@@ -773,6 +867,26 @@
             <el-input   v-model="form13.erpHzOMBaseUrl"  label="请输入erpHzOMBaseUrl"></el-input>
           </el-form-item>
 
+       <el-form-item   label="erpJstAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 5 " prop="erpJstAppKey">
+         <el-input   v-model="form13.erpJstAppKey"  label="请输入erpJstAppKey"></el-input>
+       </el-form-item>
+       <el-form-item   label="erpJstAppsecret" v-if="form13.erpOpen == 1 && form13.erpType == 5 " prop="erpJstAppsecret">
+         <el-input   v-model="form13.erpJstAppsecret"  label="erpJstAppsecret"></el-input>
+       </el-form-item>
+       <el-form-item   label="erpJstSid" v-if="form13.erpOpen == 1 && form13.erpType == 5 " prop="erpJstSid">
+         <el-input   v-model="form13.erpJstSid"  label="请输入erpJstSid"></el-input>
+       </el-form-item>
+       <el-form-item   label="erpJstShopCode" v-if="form13.erpOpen == 1 && form13.erpType == 5 " prop="erpJstShopCode">
+         <el-input   v-model="form13.erpJstShopCode"  label="请输入erpJstShopCode"></el-input>
+       </el-form-item>
+       <el-form-item   label="erpJstBaseUrl" v-if="form13.erpOpen == 1 && form13.erpType == 5 " prop="erpJstBaseUrl">
+         <el-input   v-model="form13.erpJstBaseUrl"  label="请输入erpJstBaseUrl"></el-input>
+       </el-form-item>
+       <el-form-item   label="erpJstrehouseCode" v-if="form13.erpOpen == 1 && form13.erpType == 5 " prop="erpJstrehouseCode">
+         <el-input   v-model="form13.erpJstrehouseCode"  label="请输入erpJstrehouseCode"></el-input>
+       </el-form-item>
+
+
       <el-form-item   label="appid" prop="appid">
           <el-input   v-model="form13.appid"  label="请输入appid"></el-input>
       </el-form-item>
@@ -1047,6 +1161,11 @@
              <image-upload v-model="form18.courseLogo" :limit="1" />
            </el-form-item>
 
+           <el-form-item label="侧边栏公共图" prop="sidebarImageUrl">
+             <image-upload v-model="form18.sidebarImageUrl" :limit="1" />
+           </el-form-item>
+
+
            <el-form-item label="开启评论/弹幕" prop="openCommentStatus">
              <el-radio-group v-model="form18.openCommentStatus">
                <el-radio :label="1" >开启评论</el-radio>
@@ -1068,12 +1187,34 @@
     </el-input>
   </el-tooltip>
 </el-form-item>
+ <el-form-item label="是否允许用户暂停" prop="isAllowUserPause" label-width="120">
+          <el-switch
+            v-model="form18.isAllowUserPause"
+            active-color="#13ce66"
+            inactive-color="#ff4949">
+          </el-switch>
+        </el-form-item>
            <el-form-item label="可查看评论条数" v-if="false">
              <el-tooltip class="item" effect="dark" content="在评论区可以查看的历史评论条数,默认200" placement="top-end">
                <el-input-number  v-model="form18.viewCommentNum" :min="1"></el-input-number>
              </el-tooltip>
            </el-form-item>
 
+           <el-form-item label="授权方式">
+             <el-tooltip class="item" effect="dark" content="小程序授权头像昵称方式(目前仅会员看课有效)" placement="top-end">
+               <el-radio-group v-model="form18.miniAppAuthType">
+                 <el-radio label="1">小程序原生</el-radio>
+                 <el-radio label="2">跳转H5服务号</el-radio>
+               </el-radio-group>
+             </el-tooltip>
+           </el-form-item>
+
+           <el-form-item v-if="form18.miniAppAuthType==2" label="跳转域名">
+             <el-tooltip class="item" effect="dark" content="会员看课小程序授权头像昵称,跳转H5服务号授权域名" placement="top-end">
+               <el-input style="width: 200px"  v-model="form18.userCourseAuthDomain" label="跳转域名"></el-input>
+             </el-tooltip>
+           </el-form-item>
+
            <div class="line"></div>
            <div style="float:right;margin-right:20px">
              <el-button type="primary" @click="submitForm18">提交</el-button>
@@ -1099,6 +1240,17 @@
                </el-select>
              </template>
            </el-table-column>
+           <el-table-column label="小程序原始ID" align="center" prop="username">
+             <template slot-scope="scope" v-if="scope.row.type == 1">
+               <el-input v-model="scope.row.username" placeholder="请输入原始ID" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="小程序图标" align="center" prop="log">
+             <template slot-scope="scope" v-if="scope.row.type == 1">
+               <el-image v-if="!scope.row.editing && scope.row.log" :src="scope.row.log" :preview-src-list="[scope.row.log]" />
+               <image-upload v-if="scope.row.editing" v-model="scope.row.log" :file-type='["png", "jpg", "jpeg"]' :limit="1"/>
+             </template>
+           </el-table-column>
            <el-table-column label="AppId" align="center" prop="appid">
              <template slot-scope="scope">
                <el-input v-model="scope.row.appid" placeholder="请输入AppId" :disabled="!scope.row.editing" />
@@ -1318,12 +1470,9 @@
            </el-form-item>
            <div  class="footer">
              <el-button type="primary" @click="submitForm21">提  交</el-button>
-           </div>
-         </el-form>
-       </el-tab-pane>
-      <el-tab-pane label="公司销售角色默认生成配置" name="companymenu.config">
-        <companyMenuConfig></companyMenuConfig>
-      </el-tab-pane>
+        </div>
+      </el-form>
+    </el-tab-pane>
     </el-tabs>
 
 
@@ -1350,6 +1499,7 @@ import productDeliveryGiftValueSelect from "../../components/his/productDelivery
 import { Col } from "element-ui";
 import Editor from '@/components/Editor/wang';
 import companyMenuConfig from "./companyMenuConfig";
+import {getCitys} from "@/api/store/city";
 export default {
   name: "Config",
   components: {
@@ -1358,6 +1508,7 @@ export default {
   },
   data() {
     return {
+      citys:[],
       images:[],
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       videoAccept:"video/*",
@@ -1399,6 +1550,7 @@ export default {
       },
       form12:[],
       form13:{
+        dfAccounts: [] // 初始化代付管家账户数组
       },
       form14:{
       },
@@ -1488,6 +1640,50 @@ export default {
    }
   },
   methods: {
+    handleCityChange(value) {
+      // console.log(this.$refs.citySelect,this.$refs.citySelect[0])
+      var nodes=this.$refs.citySelect[0].getCheckedNodes();
+      // console.log(nodes[0])
+      // this.account[value].cityIds=value.toString();
+      this.form13.dfAccounts[value].senderProvince=nodes[0].pathLabels[0];
+      this.form13.dfAccounts[value].senderCity=nodes[0].pathLabels[1];
+      this.form13.dfAccounts[value].senderDistrict=nodes[0].pathLabels[2];
+    },
+    getCitys(){
+        getCitys().then(res => {
+          this.loading = false;
+          this.citys=res.data;
+        })
+    },
+    // 添加代付管家账户
+    addDfAccount() {
+      this.form13.dfAccounts.push({
+        dfAppKey: '',
+        dfAppsecret: '',
+        loginAccount: '',
+        callBackUrl: '',
+        monthlyCard: '',
+        expressProductCode:'',
+        senderName: '',
+        senderPhone: '',
+        cityIds: '',
+        senderProvince: '',
+        senderCity: '',
+        senderDistrict: '',
+        senderAddress: '',
+      });
+    },
+    // 删除代付管家账户
+    removeDfAccount(index) {
+      this.$confirm('确认删除该账户?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.form13.dfAccounts.splice(index, 1);
+        this.$message.success('删除成功');
+      }).catch(() => {});
+    },
     handleSuccess(response, file) {
       // 上传成功后的回调函数
       this.myloading.close();
@@ -1631,7 +1827,16 @@ export default {
               this.form12 =JSON.parse(response.data.configValue);
           }
           if(key=="his.config"){
+              this.getCitys();
               this.form13 =JSON.parse(response.data.configValue);
+              // 确保代付管家账户数组存在
+              if (!this.form13.dfAccounts || !Array.isArray(this.form13.dfAccounts)) {
+                this.form13.dfAccounts = [];
+              }
+              // 如果没有账户,添加一个默认账户
+              if (this.form13.dfAccounts.length === 0) {
+                this.addDfAccount();
+              }
           }
           if(key=="store.config"){
              this.form17 =JSON.parse(response.data.configValue);
@@ -1778,6 +1983,9 @@ export default {
      });
   },
   submitForm13(){
+    const accounts =  this.form13.dfAccounts
+
+    console.log(accounts)
     var param={configId:this.configId,configValue:JSON.stringify(this.form13)}
     updateConfigByKey(param).then(response => {
        if (response.code === 200) {

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio