Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/views/system/config/config.vue
yjwang 6 ngày trước cách đây
mục cha
commit
6b3b3d1334

+ 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

+ 1 - 0
package.json

@@ -26,6 +26,7 @@
     "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",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src"

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

@@ -264,4 +264,11 @@ export function batchCreateErpOrder(data) {
     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'
+  })
+}
+

BIN
src/assets/logo/ylrz.png


+ 1 - 0
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"

+ 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;

+ 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>

+ 335 - 9
src/views/his/storeOrder/order1.vue

@@ -328,24 +328,35 @@
               plain
               icon="el-icon-phone"
               size="mini"
-              :disabled="multiple"
+              
               @click="setErpPhone"
               v-hasPermi="['his:storeOrder:createErpOrder']"
             >设置推送手机</el-button>
           </el-tooltip>
         </el-col>
-        <el-col :span="1.5" v-if="orderStatus == 5">
+        <!-- <el-col :span="1.5" v-if="orderStatus == 5">
           <el-tooltip content="批量推送erp" placement="top">
             <el-button
               type="warning"
               plain
               icon="el-icon-s-cooperation"
               size="mini"
-              :disabled="multiple"
               @click="createErpOrder"
               v-hasPermi="['his:storeOrder:createErpOrder']"
             >创建erp</el-button>
           </el-tooltip>
+        </el-col> -->
+        <el-col :span="1.5" v-if="orderStatus == 5">
+          <el-tooltip content="批量推送erp" placement="top">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-s-cooperation"
+              size="mini"
+              @click="showErpAccountDialog"
+              v-hasPermi="['his:storeOrder:createErpOrder']"
+            >创建erp</el-button>
+          </el-tooltip>
         </el-col>
         <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
@@ -529,7 +540,7 @@
       </div>
     </el-dialog>
     <el-dialog :title="erpPhone.title" :visible.sync="setPhoneOpen" width="600px" append-to-body>
-      <el-select v-model="erpPhoneValue" placeholder="请选择">
+      <el-select v-model="erpPhoneValue" multiple placeholder="请选择">
         <el-option
           v-for="item in phoneList"
           :key="item.phone"
@@ -542,11 +553,85 @@
         <el-button @click="handleCancelErpPhone">取 消</el-button>
       </div>
     </el-dialog>
+
+    <!-- ERP账户选择对话框 -->
+    <el-dialog :title="erpAccountDialog.title" :visible.sync="erpAccountDialog.open" width="600px" append-to-body>
+      <div v-loading="erpAccountDialog.loading">
+        <el-form :model="erpAccountForm" label-width="100px">
+          <el-form-item label="ERP账户" required>
+            <el-select 
+              v-model="erpAccountForm.selectedAccount" 
+              placeholder="请选择ERP账户" 
+              style="width: 100%"
+              filterable
+            >
+              <el-option
+                v-for="account in erpAccountList"
+                :key="account"
+                :label="account"
+                :value="account"
+              >
+                <span style="float: left">{{ account}}</span>
+                <span style="float: right; color: #8492a6; font-size: 13px">{{ account.accountCode }}</span>
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <!-- <el-form-item label="账户信息" v-if="selectedAccountInfo">
+            <div class="account-info">
+              <p><strong>账户名称:</strong>{{ selectedAccountInfo.accountName }}</p>
+              <p><strong>账户编码:</strong>{{ selectedAccountInfo.accountCode }}</p>
+              <p><strong>账户状态:</strong>
+                <el-tag :type="selectedAccountInfo.status === 1 ? 'success' : 'danger'">
+                  {{ selectedAccountInfo.status === 1 ? '正常' : '禁用' }}
+                </el-tag>
+              </p>
+              <p v-if="selectedAccountInfo.description"><strong>描述:</strong>{{ selectedAccountInfo.description }}</p>
+            </div>
+          </el-form-item> -->
+        </el-form>
+        
+        <!-- 订单统计信息 -->
+        <div class="order-summary" v-if="orderSummary">
+          <el-divider content-position="left">订单统计</el-divider>
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <div class="summary-item">
+                <span class="label">选中订单数:</span>
+                <span class="value">{{ orderSummary.selectedCount }}</span>
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div class="summary-item">
+                <span class="label">总金额:</span>
+                <span class="value">¥{{ orderSummary.totalAmount }}</span>
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div class="summary-item">
+                <span class="label">查询条件订单:</span>
+                <span class="value">{{ orderSummary.queryCount }}</span>
+              </div>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+      
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancelErpAccountDialog">取 消</el-button>
+        <el-button 
+          type="primary" 
+          @click="confirmCreateErpOrder"
+          :disabled="!erpAccountForm.selectedAccount"
+          :loading="erpAccountDialog.submitting"
+        >确认推送</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { listOrder, getOrder, delOrder, addOrder,importExpressTemplate, updateOrder, exportOrder,importTemplate,exportOrder2,queryErpPhone,saveErpPhone,editErpPhone,batchCreateErpOrder } from "@/api/his/storeOrder";
+import { listOrder, getOrder, delOrder, addOrder,importExpressTemplate, updateOrder, exportOrder,importTemplate,exportOrder2,queryErpPhone,
+  saveErpPhone,editErpPhone,batchCreateErpOrder,getErpAccount } from "@/api/his/storeOrder";
 import storeOrderDetails from '../../components/his/storeOrderDetails.vue';
 import { getToken } from "@/utils/auth";
 import {listStore} from "@/api/his/storeProduct";
@@ -563,9 +648,28 @@ export default {
     // 监听deptId
     'deptId': 'currDeptChange'
   },
+  // computed: {
+  //   // 计算选中账户的详细信息
+  //   selectedAccountInfo() {
+  //     if (!this.erpAccountForm.selectedAccount) return null;
+  //     return this.erpAccountList.find(account => account.id === this.erpAccountForm.selectedAccount);
+  //   }
+  // },
   data() {
     return {
-      erpPhoneValue:null,
+      // ERP账户相关数据
+      erpAccountDialog: {
+        open: false,
+        title: "选择ERP账户",
+        loading: false,
+        submitting: false
+      },
+      erpAccountList: [], // ERP账户列表
+      erpAccountForm: {
+        selectedAccount: null // 选中的账户ID
+      },
+      orderSummary: null, // 订单统计信息
+      erpPhoneValue:[],
       setPhoneOpen:false,
       erpPhone:{
         open:false,
@@ -784,13 +888,198 @@ export default {
 
   },
   methods: {
+    // 修改:显示ERP账户选择对话框
+    showErpAccountDialog() {
+      this.erpAccountDialog.open = true;
+      this.erpAccountDialog.loading = true;
+      this.getErpAccountList();
+      this.calculateOrderSummary();
+    },
+    
+    // 新增:获取ERP账户列表
+    async getErpAccountList() {
+      try {
+        const response = await getErpAccount();
+        if (response.code === 200) {
+          this.erpAccountList = response.data || [];
+        } else {
+          this.$message.error(response.msg || '获取ERP账户列表失败');
+          this.erpAccountList = [];
+        }
+      } catch (error) {
+        console.error('获取ERP账户列表失败:', error);
+        this.$message.error('获取ERP账户列表失败');
+        this.erpAccountList = [];
+      } finally {
+        this.erpAccountDialog.loading = false;
+      }
+    },
+    
+    // 新增:计算订单统计信息
+    calculateOrderSummary() {
+      let selectedCount = 0;
+      let totalAmount = 0;
+      let queryCount = this.total || 0;
+      
+      if (this.ids.length > 0) {
+        // 如果有选中的订单,统计选中的订单
+        selectedCount = this.ids.length;
+        this.orderList.forEach(order => {
+          if (this.ids.includes(order.orderId)) {
+            totalAmount += parseFloat(order.payMoney || 0);
+          }
+        });
+      } else {
+        // 如果没有选中订单,统计当前查询条件下的所有订单
+        selectedCount = queryCount;
+        this.orderList.forEach(order => {
+          totalAmount += parseFloat(order.payMoney || 0);
+        });
+      }
+      
+      this.orderSummary = {
+        selectedCount,
+        totalAmount: totalAmount.toFixed(2),
+        queryCount
+      };
+    },
+    
+    //确认创建ERP订单
+    confirmCreateErpOrder() {
+      if (!this.erpAccountForm.selectedAccount) {
+        this.$message.warning('请选择ERP账户');
+        return;
+      }
+      
+      // const selectedAccount = this.selectedAccountInfo;
+      // if (selectedAccount.status !== 1) {
+      //   this.$message.error('选中的ERP账户状态异常,无法推送');
+      //   return;
+      // }
+      
+      this.$confirm(
+        `确认将订单推送到ERP账户"${this.erpAccountForm.selectedAccount}"吗?`, 
+        '确认推送', 
+        {
+          confirmButtonText: '确定推送',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }
+      ).then(() => {
+        this.executeCreateErpOrder();
+      });
+    },
+    
+    //执行创建ERP订单
+    async executeCreateErpOrder() {
+      this.erpAccountDialog.submitting = true;
+      
+      try {
+        let param = {
+          loginAccount: this.erpAccountForm.selectedAccount
+        };
+        
+        if (this.ids.length > 0) {
+          // 如果有选中的订单,只推送选中的
+          param.orderIds = this.ids;
+        } else {
+          // 如果没有选中订单,推送查询条件下的所有订单
+          if (this.payTypeArr.length > 0) {
+            this.queryParams.payType = this.payTypeArr.toString();
+          } else {
+            this.queryParams.payType = null;
+          }
+          if (this.scheduleIdArr.length > 0) {
+            this.queryParams.scheduleId = this.scheduleIdArr.toString();
+          } else {
+            this.queryParams.scheduleId = null;
+          }
+          if (this.buyTypeArr.length > 0) {
+            this.queryParams.orderBuyType = this.buyTypeArr.toString();
+          } else {
+            this.queryParams.orderBuyType = null;
+          }
+          if (this.channelArr.length > 0) {
+            this.queryParams.orderChannel = this.channelArr.toString();
+          } else {
+            this.queryParams.orderChannel = null;
+          }
+          if (this.qwSubjectArr.length > 0) {
+            this.queryParams.qwSubject = this.qwSubjectArr.toString();
+          } else {
+            this.queryParams.qwSubject = null;
+          }
+          
+          // 合并查询参数
+          param = { ...param, ...this.queryParams };
+        }
+        
+        const response = await batchCreateErpOrder(param);
+        if (response.code === 200) {
+          this.$message.success('ERP订单创建成功');
+          this.cancelErpAccountDialog();
+          this.getList(); // 刷新列表
+        } else {
+          this.$message.error(response.msg || 'ERP订单创建失败');
+        }
+      } catch (error) {
+        console.error('创建ERP订单失败:', error);
+        this.$message.error('创建ERP订单失败');
+      } finally {
+        this.erpAccountDialog.submitting = false;
+      }
+    },
+    
+    // 新增:取消ERP账户选择对话框
+    cancelErpAccountDialog() {
+      this.erpAccountDialog.open = false;
+      this.erpAccountForm.selectedAccount = null;
+      this.orderSummary = null;
+      this.erpAccountList = [];
+    },
     createErpOrder(){
       this.$confirm('确认创建erp?', '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        batchCreateErpOrder(this.ids).then(response=>{
+        let param = {};
+        if(this.ids.length>0){
+          param = {orderIds:this.ids};
+        } else {
+          if(this.payTypeArr.length>0){
+            this.queryParams.payType=this.payTypeArr.toString();
+          }
+          else{
+            this.queryParams.payType=null
+          }
+          if(this.scheduleIdArr.length>0){
+            this.queryParams.scheduleId=this.scheduleIdArr.toString();
+          }
+          else{
+            this.queryParams.scheduleId=null
+          }
+          if(this.buyTypeArr.length>0){
+            this.queryParams.orderBuyType=this.buyTypeArr.toString();
+          }
+          else{
+            this.queryParams.orderbuyType=null
+          }
+          if(this.channelArr.length>0){
+            this.queryParams.orderChannel=this.channelArr.toString();
+          }
+          else{
+            this.queryParams.orderChannel=null
+          }
+          if(this.qwSubjectArr.length>0){
+            this.queryParams.qwSubject=this.qwSubjectArr.toString();
+          }
+          else{
+            this.queryParams.qwSubject=null
+          }
+          param = this.queryParams;
+        }
+        batchCreateErpOrder(param).then(response=>{
           if(response.code == 200){
             this.$message.success('创建成功');
             this.getList();
@@ -800,11 +1089,48 @@ export default {
       });
     },
     handleCancelErpPhone(){
-      this.erpPhoneValue = null;
+      this.erpPhoneValue = [];
       this.setPhoneOpen = false;
     },
     submitErpPhone(){
-      const param = {orderIds:this.ids,erpPhone:this.erpPhoneValue};
+      let param = {};
+      if(this.ids.length>0){
+        param = {orderIds:this.ids,erpPhone:this.erpPhoneValue};
+      } else {
+        if(this.payTypeArr.length>0){
+          this.queryParams.payType=this.payTypeArr.toString();
+        }
+        else{
+          this.queryParams.payType=null
+        }
+        if(this.scheduleIdArr.length>0){
+          this.queryParams.scheduleId=this.scheduleIdArr.toString();
+        }
+        else{
+          this.queryParams.scheduleId=null
+        }
+        if(this.buyTypeArr.length>0){
+          this.queryParams.orderBuyType=this.buyTypeArr.toString();
+        }
+        else{
+          this.queryParams.orderbuyType=null
+        }
+        if(this.channelArr.length>0){
+          this.queryParams.orderChannel=this.channelArr.toString();
+        }
+        else{
+          this.queryParams.orderChannel=null
+        }
+        if(this.qwSubjectArr.length>0){
+          this.queryParams.qwSubject=this.qwSubjectArr.toString();
+        }
+        else{
+          this.queryParams.qwSubject=null
+        }
+        param = this.queryParams;
+        param.erpPhone=this.erpPhoneValue;
+      }
+      
       editErpPhone(param).then(response=>{
         this.msgSuccess("修改成功");
         this.setPhoneOpen = false;

+ 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;
     });
   },

+ 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">
       <!-- 未上线部分 -->

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

@@ -720,6 +720,7 @@
         <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">
@@ -737,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>
@@ -1068,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>
@@ -1365,12 +1463,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>
 
 
@@ -1397,6 +1492,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: {
@@ -1405,6 +1501,7 @@ export default {
   },
   data() {
     return {
+      citys:[],
       images:[],
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       videoAccept:"video/*",
@@ -1446,6 +1543,7 @@ export default {
       },
       form12:[],
       form13:{
+        dfAccounts: [] // 初始化代付管家账户数组
       },
       form14:{
       },
@@ -1535,6 +1633,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();
@@ -1678,7 +1820,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);
@@ -1825,6 +1976,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) {