浏览代码

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

ct 2 天之前
父节点
当前提交
5ac253c144

+ 17 - 1
src/api/company/statistics.js

@@ -54,7 +54,23 @@ export function inquiryOrder(query) {
     params: query
   })
 }
+// 获取互联网医院订单统计数据
+export function getHisOrderCountStats(query) {
+  return request({
+    url: '/company/statistics/hisOrderCountStats',
+    method: 'get',
+    params: query
+  });
+}
 
+// 获取App商城订单统计数据
+export function getAppOrderCount(query) {
+  return request({
+    url: '/company/statistics/appOrderCountStats',
+    method: 'get',
+    params: query
+  });
+}
 
 export function exportStoreOrder(query) {
   return request({
@@ -170,4 +186,4 @@ export function exportTuiMoney(query) {
     method: 'get',
     params: query
   })
-}
+}

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

@@ -164,6 +164,13 @@ export function updateStoreOrder(data) {
     data: data
   })
 }
+export function updateAddressErpFsStoreOrder(data) {
+  return request({
+    url: '/his/storeOrder/updateAddressErpFsStoreOrder',
+    method: 'put',
+    data: data
+  })
+}
 
 export function updateDelivery(data) {
   return request({

+ 10 - 1
src/api/hisStore/storeOrder.js

@@ -103,7 +103,13 @@ export function updateStoreOrder(data) {
     data: data
   })
 }
-
+export function updateAddressErpFsStoreOrder(data) {
+  return request({
+    url: '/store/store/storeOrder/updateAddressErpFsStoreOrder',
+    method: 'put',
+    data: data
+  })
+}
 // 修改物流编号
 export function updateDeliveryId(data) {
   return request({
@@ -326,6 +332,7 @@ export function orderDimensionStatisticsExport(query) {
 export function importDeliveryNoteExpressTemplate() {
   return request({
     url: '/store/store/storeOrder/importDeliveryNoteExpressTemplate',
+<<<<<<< HEAD
     method: 'get'
   })
 }
@@ -374,6 +381,8 @@ export function batchSetErpOrder(data) {
 export function getErpAccount() {
   return request({
     url: '/store/store/storeOrder/getErpAccount',
+=======
+>>>>>>> 04e9aa17dd9058d3feb4ed058f321df845dd083c
     method: 'get'
   })
 }

+ 3 - 0
src/views/company/company/index.vue

@@ -228,6 +228,9 @@
          <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" type="textarea"  :rows="2" placeholder="请输入备注" />
         </el-form-item>
+        <el-form-item label="经销商归属" prop="companyBelongOwner">
+          <el-input v-model="form.companyBelongOwner" placeholder="请输入经销售归属" />
+        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>

+ 86 - 53
src/views/components/his/storeOrderDetails.vue

@@ -351,7 +351,7 @@
                       v-model="payMoney"
                       :precision="2"
                       :step="0.1"
-                      disabled   
+                      disabled
                     />
                   </el-form-item>
                   <el-form-item label="物流代收金额">
@@ -446,7 +446,7 @@
                 >
                 <el-table border v-if="refundShowProd!=null" :data="refundShowProd" ref="refundTable" size="small"  @selection-change="handleSelectionChange">
                   <el-table-column type="selection" width="55" align="center" />
-                  
+
                   <el-table-column label="商品编码" width="110" align="center">
                     <template slot-scope="scope">
                       <p>{{ JSON.parse(scope.row.jsonInfo).barCode }}</p>
@@ -467,10 +467,10 @@
 
                   <el-table-column label="退款单价" width="200" align="center">
                     <template slot-scope="scope">
-                      <el-input-number 
-                        v-model="scope.row.money" 
-                        :precision="2" 
-                        :step="0.1" 
+                      <el-input-number
+                        v-model="scope.row.money"
+                        :precision="2"
+                        :step="0.1"
                         :min="0"
                         size="mini"
                       />
@@ -479,17 +479,17 @@
 
                   <el-table-column label="退款数量" width="200" align="center">
                     <template slot-scope="scope">
-                      <el-input-number 
-                        v-model="scope.row.num" 
-                        :min="0" 
-                        :max="scope.row.originNum"   
+                      <el-input-number
+                        v-model="scope.row.num"
+                        :min="0"
+                        :max="scope.row.originNum"
                         size="mini"
                       />
                     </template>
                   </el-table-column>
 
                 </el-table>
-               
+
                 <div style="margin-top:10px;">
                   合计退款金额:
                   <span style="color:red; font-weight:bold;">
@@ -509,13 +509,44 @@
 </template>
 
 <script>
-import {getMsgFollow,sendMsg,msgList,updateMoney,getGoods,getEroOrder,editTuiMoney,updateDelivery,createErpOrder,updateExpress,updateErp, afterSales,sendgoods,logList,listOrder,getExpress,syncExpress, listOrderitem,getOrder, delOrder, addOrder, updateStoreOrder, exportOrder,payment,tuiOrder ,getPrescribe,getOrderUserPhone,returnCost} from "@/api/his/storeOrder";
+import {
+  getMsgFollow,
+  sendMsg,
+  msgList,
+  updateMoney,
+  getGoods,
+  getEroOrder,
+  editTuiMoney,
+  updateDelivery,
+  createErpOrder,
+  updateExpress,
+  updateErp,
+  afterSales,
+  sendgoods,
+  logList,
+  listOrder,
+  getExpress,
+  syncExpress,
+  listOrderitem,
+  getOrder,
+  delOrder,
+  addOrder,
+  updateStoreOrder,
+  exportOrder,
+  payment,
+  tuiOrder,
+  getPrescribe,
+  getOrderUserPhone,
+  returnCost,
+  updateAddressErpFsStoreOrder
+} from "@/api/his/storeOrder";
 import inquiryOrderDetails from '../his/inquiryOrderDetails.vue';
 import packageOrderDetails from '../his/packageOrderDetails2.vue';
 import prescribeDetails from '../his/prescribeDetails.vue';
 import msgDetails from '../../components/his/followMsgDetails.vue';
 import { getTcmScheduleList } from "@/api/company/schedule";
 import {getCitys} from "@/api/store/city";
+
   export default {
     name: "orderDe",
     props:["data"],
@@ -778,7 +809,7 @@ import {getCitys} from "@/api/store/city";
       },
       handlePhone(){
         const orderId = this.item.orderId;
-        getOrderUserPhone(orderId).then(response =>{
+        return getOrderUserPhone(orderId).then(response =>{
             this.item.userPhone = response.userPhone;
         })
       },
@@ -879,7 +910,7 @@ import {getCitys} from "@/api/store/city";
           payPrice: this.payPrice,
         };
 
-        updateStoreOrder(payload).then(response => {
+        updateAddressErpFsStoreOrder(payload).then(response => {
           if (response.code === 200) {
             this.msgSuccess("操作成功");
             this.edit.open = false;
@@ -897,47 +928,49 @@ import {getCitys} from "@/api/store/city";
         });
     },
     editOrder() {
-      this.edit.open = true;
-      this.editForm.orderId = this.item.orderId;
-      this.editForm.remark = this.item.remark;
-
-      // 先设置其他同步的字段
-      this.editForm.userPhone = this.item.userPhone != null ? this.item.userPhone.toString() : "";
-      this.editForm.status = this.item.status != null ? this.item.status.toString() : "";
-      this.editForm.deliveryType = this.item.deliveryType;
-      this.editForm.deliveryStatus = this.item.deliveryStatus;
-      this.payMoney= this.item.payMoney;
-      this.payRemain = this.item.payRemain;
-      this.payPrice= this.item.payPrice;
-      // 等城市数据加载后再解析地址
-      const currentAddress = (this.item.userAddress || "").toString().trim();
-      this.getCitys().then(() => {
-        if (!currentAddress) {
-          this.cityIds = [];
-          this.editForm.userAddress = "";
-          return;
-        }
+      this.handlePhone().then((res)=>{
+        this.edit.open = true;
+        this.editForm.orderId = this.item.orderId;
+        this.editForm.remark = this.item.remark;
+
+        // 先设置其他同步的字段
+        this.editForm.userPhone = this.item.userPhone != null ? this.item.userPhone.toString() : "";
+        this.editForm.status = this.item.status != null ? this.item.status.toString() : "";
+        this.editForm.deliveryType = this.item.deliveryType;
+        this.editForm.deliveryStatus = this.item.deliveryStatus;
+        this.payMoney= this.item.payMoney;
+        this.payRemain = this.item.payRemain;
+        this.payPrice= this.item.payPrice;
+        // 等城市数据加载后再解析地址
+        const currentAddress = (this.item.userAddress || "").toString().trim();
+        this.getCitys().then(() => {
+          if (!currentAddress) {
+            this.cityIds = [];
+            this.editForm.userAddress = "";
+            return;
+          }
 
-        // 假设格式为:省 市 区 详细地址(空格分隔)
-        const parts = currentAddress.split(/\s+/);
-        const detail = parts.pop() || ""; // 最后一段作为详细地址
-        const provLabel = parts[0];
-        const cityLabel = parts[1];
-        const areaLabel = parts[2];
+          // 假设格式为:省 市 区 详细地址(空格分隔)
+          const parts = currentAddress.split(/\s+/);
+          const detail = parts.pop() || ""; // 最后一段作为详细地址
+          const provLabel = parts[0];
+          const cityLabel = parts[1];
+          const areaLabel = parts[2];
 
-        const province = this.citys.find(p => p.label === provLabel);
-        const city = province?.children?.find(c => c.label === cityLabel);
-        const area = city?.children?.find(a => a.label === areaLabel);
+          const province = this.citys.find(p => p.label === provLabel);
+          const city = province?.children?.find(c => c.label === cityLabel);
+          const area = city?.children?.find(a => a.label === areaLabel);
 
-        if (province && city && area) {
-          this.cityIds = [province.value, city.value, area.value];
-        } else {
-          console.warn("未匹配到完整省市区:", { provLabel, cityLabel, areaLabel });
-          this.cityIds = [];
-        }
-        // 把详细地址写回到输入框(只保留详细地址,不含省市区)
-        this.editForm.userAddress = detail;
-      });
+          if (province && city && area) {
+            this.cityIds = [province.value, city.value, area.value];
+          } else {
+            console.warn("未匹配到完整省市区:", { provLabel, cityLabel, areaLabel });
+            this.cityIds = [];
+          }
+          // 把详细地址写回到输入框(只保留详细地址,不含省市区)
+          this.editForm.userAddress = detail;
+        });
+      })
     },
     updateExpress(){
       var that=this;
@@ -1067,7 +1100,7 @@ import {getCitys} from "@/api/store/city";
         } else {
           this.refund(); //正常退款
         }
-        
+
       },
       submitRefundForm(){
         if(this.refundForm.refundAmount<=0){

+ 65 - 20
src/views/course/courseWatchLog/statistics.vue

@@ -75,7 +75,14 @@
       </el-form-item>
     </el-form>
 
-    <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange"  show-summary>
+    <el-table
+      border
+      v-loading="loading"
+      :data="courseWatchLogList"
+      @selection-change="handleSelectionChange"
+      show-summary
+      :summary-method="getSummaries"
+    >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="用户" align="center" prop="userName" />
       <el-table-column label="对应销售" align="center" prop="companyUserName" />
@@ -185,6 +192,44 @@ export default {
 
   },
   methods: {
+    /** 自定义合计方法 */
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '合计';
+          return;
+        }
+
+        // 排除不需要合计的列(小节名称和其他文本列)
+        const excludeColumns = ['userName', 'companyUserName', 'createTime', 'projectName', 'courseName', 'videoName'];
+        const prop = column.property;
+
+        if (excludeColumns.includes(prop)) {
+          sums[index] = '--';
+          return;
+        }
+
+        // 对数值列进行合计
+        const values = data.map(item => Number(item[prop]));
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+        } else {
+          sums[index] = '--';
+        }
+      });
+
+      return sums;
+    },
+
     handleSeller(){
       console.log(this.queryParams.companyId)
       if(this.queryParams.companyId != null) {
@@ -351,30 +396,30 @@ export default {
     handleDelete(row) {
       const logIds = row.logId || this.ids;
       this.$confirm('是否确认删除短链课程看课记录编号为"' + logIds + '"的数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return delCourseWatchLog(logIds);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("删除成功");
-        }).catch(() => {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delCourseWatchLog(logIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
     },
     /** 导出按钮操作 */
     handleExport() {
       const queryParams = this.queryParams;
       this.$confirm('是否确认导出所有短链课程看课记录数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportCourseWatchLog(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportCourseWatchLog(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
     },
     handleScheduleTimeChange(val) {
       if (val) {

+ 13 - 1
src/views/course/userWatchCourseStatistics/index.vue

@@ -57,6 +57,16 @@
         />
       </el-form-item>
 
+      <el-form-item label="经销商" prop="companyBelongOwner">
+        <el-input
+          v-model="queryParams.companyBelongOwner"
+          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>
@@ -80,6 +90,7 @@
 
     <el-table border v-loading="loading" :data="userWatchCourseStatisticsList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="经销商归属" align="center" prop="companyBelongOwner" />
       <el-table-column label="营期名称" align="center" prop="periodName" />
       <el-table-column label="营期线" align="center" prop="periodStartingTime" />
       <el-table-column label="播出时间" align="center" prop="courseStartDateTime" />
@@ -248,7 +259,8 @@ export default {
         answerRightNum: null,
         answerRightRate: null,
         redPacketNum: null,
-        redPacketAmount: null
+        redPacketAmount: null,
+        companyBelongOwner: null
       },
       // 表单参数
       form: {},

+ 14 - 1
src/views/course/userWatchCourseTotalStatistics/index.vue

@@ -56,6 +56,16 @@
         />
       </el-form-item>
 
+      <el-form-item label="经销商" prop="companyBelongOwner">
+        <el-input
+          v-model="queryParams.companyBelongOwner"
+          placeholder="请输入经销商归属"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
 <!--      <el-form-item label="所属销售" prop="companyUserName">-->
 <!--        <el-input-->
 <!--          v-model="queryParams.companyUserName"-->
@@ -88,6 +98,7 @@
 
     <el-table border v-loading="loading" :data="userWatchCourseStatisticsList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="经销商归属" align="center" prop="companyBelongOwner" />
       <el-table-column label="营期名称" align="center" prop="periodName" />
       <el-table-column label="营期线" align="center" prop="periodStartingTime" />
       <el-table-column label="播出时间" align="center" prop="courseStartDateTime" />
@@ -103,6 +114,7 @@
       <el-table-column label="完播率" align="center" prop="completeWatchRatePercent" />
       <el-table-column label="红包领取个数" align="center" prop="redPacketNum" />
       <el-table-column label="红包领取总额" align="center" prop="redPacketAmount" />
+
     </el-table>
 
     <pagination
@@ -253,7 +265,8 @@ export default {
         answerRightNum: null,
         answerRightRate: null,
         redPacketNum: null,
-        redPacketAmount: null
+        redPacketAmount: null,
+        companyBelongOwner: null
       },
       // 表单参数
       form: {},

+ 14 - 1
src/views/course/userWatchStatistics/index.vue

@@ -30,6 +30,16 @@
         />
       </el-form-item>
 
+      <el-form-item label="经销商" prop="companyBelongOwner">
+        <el-input
+          v-model="queryParams.companyBelongOwner"
+          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>
@@ -54,6 +64,7 @@
 
     <el-table border v-loading="loading" :data="userWatchStatisticsList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="经销商归属" align="center" prop="companyBelongOwner" />
       <el-table-column label="营期名称" align="center" prop="periodName" />
       <el-table-column label="营期线" align="center" prop="periodStartingTime" width="180">
         <template slot-scope="scope">
@@ -68,6 +79,7 @@
       <el-table-column label="完播人数" align="center" prop="completeWatchNum" />
       <el-table-column label="完播率" align="center" prop="completeWatchRatePercent" />
 
+
     </el-table>
 
     <pagination
@@ -158,7 +170,8 @@ export default {
         userNum: null,
         watchNum: null,
         completeWatchNum: null,
-        completeWatchRate: null
+        completeWatchRate: null,
+        companyBelongOwner: null
       },
       // 表单参数
       form: {},

+ 8 - 8
src/views/his/answer/index.vue

@@ -1,11 +1,11 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <!-- <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <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-form> -->
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
@@ -94,7 +94,7 @@
             <div v-for="(option, optionIndex) in answer.options" :key="optionIndex" class="option-item">
               <div class="option-input">
                 <el-input 
-                  v-model="answer.options[optionIndex]" 
+                  v-model="answer.options[optionIndex].name" 
                   :placeholder="`选项 ${optionIndex + 1}`">
                 </el-input>
               </div>
@@ -195,7 +195,7 @@ export default {
             answers: [
               {
                 title: '',
-                options: ['']
+                options: [{name:'',value:0}]
               }
             ]
           },
@@ -216,7 +216,7 @@ export default {
     addItem(length) {
           this.form.answers.push({
             title: '',
-            options: ['']
+            options: [{name:'',value:0}]
           })
         },
         delItem(item, index) {
@@ -242,7 +242,7 @@ export default {
           }
         },
         addOption(answerIndex, optionIndex) {
-          this.form.answers[answerIndex].options.push('')
+          this.form.answers[answerIndex].options.push({name:'',value:optionIndex + 1})
         },
         delOption(options, index) {
           if (options.length > 1) {
@@ -330,7 +330,7 @@ export default {
         this.form = {
           answers: [{
             title: '',
-            options: ['']
+            options: [{name:'',value:0}]
           }
 
           ]
@@ -347,7 +347,7 @@ export default {
           this.form = {
             answers: [{
               title: '',
-              options: []
+              options: [{name:'',value:0}]
             }
 
             ]

+ 1 - 1
src/views/his/doctor/type1.vue

@@ -635,7 +635,7 @@
          
          <el-row>
                <el-col :span="12">
-                 <el-form-item label="登录账号" prop="account" v-if="form.doctorId==null||form.doctorId==''">
+                 <el-form-item label="登录账号" prop="account" >
                    <el-input v-model="form.account" placeholder="请输入账号名称" />
                  </el-form-item>
                </el-col>

+ 7 - 7
src/views/his/package/index.vue

@@ -569,7 +569,7 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="问答" prop="questionId" >
+        <!-- <el-form-item label="问答" prop="questionId" >
            <el-select v-model="form.questionId" placeholder="请选择问答">
               <el-option
                   v-for="dict in questionOptions"
@@ -578,7 +578,7 @@
                   :value="parseInt(dict.dictValue)"
                 />
            </el-select>
-        </el-form-item>
+        </el-form-item> -->
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -663,7 +663,7 @@ import {
 import {getAllFollowTempName } from "@/api/his/followTemp";
 import {getAllCateList} from "@/api/his/packageCate";
 import {allIcd } from "@/api/his/icd";
-import {questionOptions } from "@/api/his/answer";
+// import {questionOptions } from "@/api/his/answer";
 import packageDetails from '../../components/his/packageDetails.vue';
 import productAttrValueSelect from "../../components/his/productAttrValueSelect.vue";
 import { listStore } from "@/api/his/storeProduct";
@@ -713,7 +713,7 @@ export default {
               url: process.env.VUE_APP_BASE_API + "/his/package/importData"
             },
       productTypeOptions: [],
-      questionOptions: [],
+      // questionOptions: [],
       storeId:null,
       storeOPtions:[],
       usageFrequencyUnitOptions:[{
@@ -868,9 +868,9 @@ export default {
     listStore().then(response => {
       this.storeOPtions = response.rows;
     });
-    questionOptions().then(res => {
-      this.questionOptions = res.rows;
-    })
+    // questionOptions().then(res => {
+    //   this.questionOptions = res.rows;
+    // })
   },
   methods: {
     getSolarTermLabel(solarTerm) {

+ 179 - 0
src/views/his/statistics/appOrderCountStats.vue

@@ -0,0 +1,179 @@
+<template>
+  <div class="app-container">
+    <div class="app-content">
+      <div class="title">App商城订单统计</div>
+      <el-form class="search-form" :inline="true">
+        <el-form-item>
+          <treeselect
+            :clearable="false"
+            v-model="companyId"
+            :options="deptOptions"
+            :show-count="true"
+            placeholder="请选择归属部门"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            filterable
+            v-model="companyUserId"
+            placeholder="请选择员工"
+            clearable
+            size="small"
+          >
+            <el-option
+              v-for="item in users"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="下单日期">
+          <el-date-picker
+            clearable
+            size="small"
+            style="width: 205.4px"
+            v-model="dateRange"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        </el-form-item>
+      </el-form>
+
+      <div class="data-box">
+        <div class="table-box">
+          <el-table
+            :data="tableData"
+            border
+            max-height="500"
+            style="width: 100%"
+          >
+            <el-table-column prop="totalOrderCount" label="订单总数" />
+            <el-table-column prop="fullPayOrderCount" label="全款支付订单数" />
+            <el-table-column prop="codOrderCount" label="物流代收支付订单数" />
+            <el-table-column prop="depositCodOrderCount" label="付定金的物流代收订单数" />
+            <el-table-column prop="noDepositCodOrderCount" label="0定金的物流代收订单数" />
+            <el-table-column prop="totalOrderAmount" label="订单总金额" />
+            <el-table-column prop="depositAmount" label="定金总金额" />
+            <el-table-column prop="codAmount" label="物流代收总金额" />
+          </el-table>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getAppOrderCount } from "@/api/company/statistics";
+import { getUserListByDeptId } from "@/api/company/companyUser";
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "AppOrderCountStats",
+  components: { Treeselect },
+  watch: {
+    companyId: {
+      handler(newVal) {
+        if (newVal != null) {
+          this.companyUserId = null;
+          this.getUserListByDeptId();
+        } else {
+          this.users = [];
+          this.companyUserId = null;
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      companyId: null,
+      companyUserId: null,
+      users: [],
+      deptOptions: [],
+      dateRange: [],
+      tableData: []
+    };
+  },
+  created() {
+    this.loadDeptTree();
+  },
+  methods: {
+    loadDeptTree() {
+      treeselect().then(response => {
+        this.deptOptions = response.data;
+        if (response.data && response.data.length > 0) {
+          this.companyId = response.data[0].id;
+        }
+      });
+    },
+
+    getUserListByDeptId() {
+      if (!this.companyId) return;
+      getUserListByDeptId({ deptId: this.companyId }).then(response => {
+        this.users = response.data || [];
+      });
+    },
+
+    search() {
+      const params = {
+        companyId: this.companyId,
+        companyUserId: this.companyUserId,
+        startTime: this.dateRange?.[0] || undefined,
+        endTime: this.dateRange?.[1] ? this.dateRange[1] + " 23:59:59" : undefined
+      };
+
+      getAppOrderCount(params).then(response => {
+        const vo = response.data;
+        this.tableData = vo ? [vo] : [];
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  border: 1px solid #e6e6e6;
+  padding: 12px;
+
+  .app-content {
+    background-color: white;
+    .title {
+      padding: 20px 30px 0px 30px;
+      font-size: 18px;
+      font-weight: bold;
+      color: black;
+    }
+    .search-form {
+      margin: 20px 30px 0px 30px;
+    }
+    .data-box {
+      padding: 30px;
+      background-color: rgb(255, 255, 255);
+      height: 100%;
+
+      .table-box {
+        margin-top: 15px;
+      }
+    }
+  }
+}
+
+.vue-treeselect {
+  width: 217px;
+  height: 36px;
+}
+</style>
+
+<style>
+.vue-treeselect__control {
+  display: block;
+}
+</style>

+ 186 - 0
src/views/his/statistics/hisOrderCountStats.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container">
+    <div class="app-content">
+      <div class="title">互联网医院订单统计</div>
+      <el-form class="search-form" :inline="true">
+        <el-form-item>
+          <treeselect
+            :clearable="false"
+            v-model="companyId"
+            :options="deptOptions"
+            :show-count="true"
+            placeholder="请选择归属部门"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            filterable
+            v-model="companyUserId"
+            placeholder="请选择员工"
+            clearable
+            size="small"
+          >
+            <el-option
+              v-for="item in users"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="下单日期">
+          <el-date-picker
+            clearable
+            size="small"
+            style="width: 205.4px"
+            v-model="dateRange"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        </el-form-item>
+      </el-form>
+
+      <div class="data-box">
+        <div class="table-box">
+          <el-table
+            :data="tableData"
+            border
+            max-height="500"
+            style="width: 100%"
+          >
+            <el-table-column prop="totalOrderCount" label="订单总数" />
+            <el-table-column prop="fullPayOrderCount" label="全款支付订单数" />
+            <el-table-column prop="codOrderCount" label="物流代收支付订单数" />
+            <el-table-column prop="depositCodOrderCount" label="付定金的物流代收订单数" />
+            <el-table-column prop="noDepositCodOrderCount" label="0定金的物流代收订单数" />
+            <el-table-column prop="totalOrderAmount" label="订单总金额" />
+            <el-table-column prop="depositAmount" label="定金总金额" />
+            <el-table-column prop="codAmount" label="物流代收总金额" />
+          </el-table>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getHisOrderCountStats } from "@/api/company/statistics";
+import { getUserListByDeptId } from "@/api/company/companyUser";
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "HisOrderCountStats",
+  components: { Treeselect },
+  watch: {
+    // 监听 companyId 变化,自动重载员工列表
+    companyId: {
+      handler(newVal) {
+        if (newVal != null) {
+          this.companyUserId = null; // 清空已选员工
+          this.getUserListByDeptId();
+        } else {
+          this.users = [];
+          this.companyUserId = null;
+        }
+      },
+      immediate: false
+    }
+  },
+  data() {
+    return {
+      companyId: null,        // 销售公司(部门)ID
+      companyUserId: null,    // 销售人员(员工)ID
+      users: [],              // 员工列表
+      deptOptions: [],        // 部门树形数据
+      dateRange: [],          // 日期范围
+      tableData: []           // 表格数据
+    };
+  },
+  created() {
+    this.loadDeptTree();
+  },
+  methods: {
+    // 加载部门树
+    loadDeptTree() {
+      treeselect().then(response => {
+        this.deptOptions = response.data;
+        if (response.data && response.data.length > 0) {
+          // 默认选中第一个部门
+          this.companyId = response.data[0].id;
+          // 触发 watch 自动加载员工(无需手动调用)
+        }
+      });
+    },
+
+    // 根据 companyId 获取员工列表
+    getUserListByDeptId() {
+      if (!this.companyId) return;
+      getUserListByDeptId({ deptId: this.companyId }).then(response => {
+        this.users = response.data || [];
+      });
+    },
+
+    // 搜索统计
+    search() {
+      const params = {
+        companyId: this.companyId,
+        companyUserId: this.companyUserId,
+        startTime: this.dateRange?.[0] || undefined,
+        endTime: this.dateRange?.[1] ? this.dateRange[1] + " 23:59:59" : undefined
+      };
+
+      getHisOrderCountStats(params).then(response => {
+        const vo = response.data;
+        this.tableData = vo ? [vo] : [];
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  border: 1px solid #e6e6e6;
+  padding: 12px;
+
+  .app-content {
+    background-color: white;
+    .title {
+      padding: 20px 30px 0px 30px;
+      font-size: 18px;
+      font-weight: bold;
+      color: black;
+    }
+    .search-form {
+      margin: 20px 30px 0px 30px;
+    }
+    .data-box {
+      padding: 30px;
+      background-color: rgb(255, 255, 255);
+      height: 100%;
+
+      .table-box {
+        margin-top: 15px;
+      }
+    }
+  }
+}
+
+.vue-treeselect {
+  width: 217px;
+  height: 36px;
+}
+</style>
+
+<style>
+.vue-treeselect__control {
+  display: block;
+}
+</style>

+ 1 - 0
src/views/his/storeOrder/order1.vue

@@ -526,6 +526,7 @@
         </el-table-column>
           <el-table-column label="下单时间" align="center" prop="createTime" width="180" />
         <el-table-column label="支付时间" align="center" prop="payTime" width="180" />
+        <el-table-column label="发货时间" align="center" prop="deliverySendTime" width="180" />
         <el-table-column label="订单状态" align="center" prop="status" >
           <template slot-scope="scope">
                 <dict-tag :options="orderOptions" :value="scope.row.status"/>

+ 41 - 11
src/views/hisStore/components/productOrder.vue

@@ -495,7 +495,29 @@
 </template>
 
 <script>
-import {auditPayRemain,addTuiMoney,syncExpress,updateExpress,getEroOrder,refundOrderMoney, editTuiMoney,getExpress,finishOrder,listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder,updateDeliveryId, createErpOrder,updateErp,getStoreOrderAddress,getStoreOrderPhone} from "@/api/hisStore/storeOrder";
+import {
+  auditPayRemain,
+  addTuiMoney,
+  syncExpress,
+  updateExpress,
+  getEroOrder,
+  refundOrderMoney,
+  editTuiMoney,
+  getExpress,
+  finishOrder,
+  listStoreOrder,
+  getStoreOrder,
+  delStoreOrder,
+  addStoreOrder,
+  updateStoreOrder,
+  exportStoreOrder,
+  updateDeliveryId,
+  createErpOrder,
+  updateErp,
+  getStoreOrderAddress,
+  getStoreOrderPhone,
+  updateAddressErpFsStoreOrder
+} from "@/api/hisStore/storeOrder";
 import { getTcmScheduleList } from "@/api/company/schedule";
 export default {
   name: "order",
@@ -595,7 +617,7 @@ export default {
   methods: {
     handleAddress(){
         const id = this.order.id;
-        getStoreOrderAddress(id).then(response =>{
+        return getStoreOrderAddress(id).then(response =>{
             this.order.userAddress = response.address;
         })
       },
@@ -677,7 +699,7 @@ export default {
     submitEditForm(){
         this.$refs["editForm"].validate(valid => {
         if (valid) {
-          updateStoreOrder(this.editForm).then(response => {
+          updateAddressErpFsStoreOrder(this.editForm).then(response => {
             if (response.code === 200) {
               this.msgSuccess("操作成功");
               this.edit.open = false;
@@ -786,16 +808,24 @@ export default {
           this.getOrder(this.order.id);
         }).catch(function() {});
     },
-    editOrder(){
-        this.edit.open=true;
-        this.editForm.id=this.order.id;
-        this.editForm.mark=this.order.mark
-        this.editForm.orderType=this.order.orderType.toString();
+    async editOrder(){
+      try {
+        // 先获取地址信息
+        const response = await getStoreOrderAddress(this.order.id);
+        this.order.userAddress = response.address;
+
+        // 等待地址获取完成后打开编辑对话框
+        this.edit.open = true;
+        this.editForm.id = this.order.id;
+        this.editForm.mark = this.order.mark;
+        this.editForm.orderType = this.order.orderType.toString();
         this.editForm.status = this.order.status.toString();
-        this.editForm.userAddress = this.order.userAddress.toString();
+        this.editForm.userAddress = response.address;
         this.editForm.scheduleId = this.order.scheduleId;
-        // this.editForm.extendOrderId = this.order.extendOrderId.toString();
-
+      } catch (error) {
+        console.error('获取地址失败:', error);
+        this.msgError('获取地址信息失败');
+      }
     },
     //推送管易按钮
     addErpOrder(){

+ 1 - 0
src/views/hisStore/storeOrder/healthStoreList.vue

@@ -457,6 +457,7 @@
       <!-- <el-table-column label="支付状态" align="center" prop="paid" /> -->
       <el-table-column align="center" label="支付时间" prop="payTime" width="180">
       </el-table-column>
+      <el-table-column align="center" label="发货时间" prop="deliverySendTime"/>
       <el-table-column align="center" label="支付方式" prop="payType">
         <template slot-scope="scope">
           <el-tag v-for="(item, index) in payTypeOptions" v-if="scope.row.payType==item.dictValue" prop="payType">

+ 2 - 2
src/views/hisStore/storeOrder/index.vue

@@ -494,8 +494,8 @@
       </el-table-column>
       <el-table-column label="下单时间" align="center" prop="createTime" />
       <!-- <el-table-column label="支付状态" align="center" prop="paid" /> -->
-      <el-table-column label="支付时间" align="center" prop="payTime" width="180">
-      </el-table-column>
+      <el-table-column label="支付时间" align="center" prop="payTime" width="180" />
+      <el-table-column label="发货时间" align="center" prop="deliverySendTime" width="180"></el-table-column>
       <el-table-column label="支付方式" align="center" prop="payType" >
           <template slot-scope="scope">
               <el-tag prop="payType" v-for="(item, index) in payTypeOptions"    v-if="scope.row.payType==item.dictValue">{{item.dictLabel}}</el-tag>

+ 2 - 0
src/views/system/config/config.vue

@@ -2862,6 +2862,8 @@ export default {
           console.log(this.form27)
         }
         if (key == 'his.zzzs') {
+          this.configId = response.data.configId
+          this.configKey = response.data.configKey
           this.form28 = {...this.form28, ...JSON.parse(response.data.configValue)}
         }
       })