Переглянути джерело

Merge branch 'refs/heads/ScrmStores' into mergeScrmStores

chenguo 3 тижнів тому
батько
коміт
ff3ce6d46c

+ 40 - 0
.env.prod-czt

@@ -0,0 +1,40 @@
+# 页面标题
+VUE_APP_TITLE =内蒙古纯正堂互联网医院管理系统
+# 首页菜单标题
+VUE_APP_TITLE_INDEX =内蒙古纯正堂互联网医院
+# 公司名称
+VUE_APP_COMPANY_NAME =内蒙古纯正堂大药房有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =京ICP备2024053040号-5
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/czt.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 = czt-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = czt-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://czttcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://cztobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 53 - 0
src/api/deptConfigLog/sysDeptConfigLog.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询系统部门资源配置使用记录列表
+export function listSysDeptConfigLog(query) {
+  return request({
+    url: '/deptConfigLog/sysDeptConfigLog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询系统部门资源配置使用记录详细
+export function getSysDeptConfigLog(id) {
+  return request({
+    url: '/deptConfigLog/sysDeptConfigLog/' + id,
+    method: 'get'
+  })
+}
+
+// 新增系统部门资源配置使用记录
+export function addSysDeptConfigLog(data) {
+  return request({
+    url: '/deptConfigLog/sysDeptConfigLog',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改系统部门资源配置使用记录
+export function updateSysDeptConfigLog(data) {
+  return request({
+    url: '/deptConfigLog/sysDeptConfigLog',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除系统部门资源配置使用记录
+export function delSysDeptConfigLog(id) {
+  return request({
+    url: '/deptConfigLog/sysDeptConfigLog/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出系统部门资源配置使用记录
+export function exportSysDeptConfigLog(query) {
+  return request({
+    url: '/deptConfigLog/sysDeptConfigLog/export',
+    method: 'get',
+    params: query
+  })
+}

+ 16 - 0
src/api/hisStore/store.js

@@ -9,6 +9,14 @@ export function listStore(query) {
   })
 }
 
+export function listStoreOptions(query) {
+  return request({
+    url: '/store/his/store/listOption',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询店铺管理详细
 export function getStore(storeId) {
   return request({
@@ -74,3 +82,11 @@ export function getStoreAuditLog(storeId) {
     method: 'get'
   })
 }
+
+export function getStoreColumns(query) {
+  return request({
+    url: '/store/his/store/getStoreColumns',
+    method: 'get',
+    params: query
+  })
+}

+ 8 - 0
src/api/hisStore/storeProduct.js

@@ -109,4 +109,12 @@ export function productBySearCh(query) {
   })
 }
 
+export function getStoreProductColumns(query) {
+  return request({
+    url: '/store/store/storeProduct/getStoreProductColumns',
+    method: 'get',
+    params: query
+  })
+}
+
 

+ 30 - 1
src/api/system/dept.js

@@ -65,4 +65,33 @@ export function delDept(deptId) {
     url: '/system/dept/' + deptId,
     method: 'delete'
   })
-}
+}
+
+// 查询部门详细
+export function updatePadNum(data) {
+  return request({
+    url: '/system/dept/updatePadNum',
+    method: 'get',
+    params: data
+  })
+}
+
+
+// 查询部门详细
+export function addRedMoney(data) {
+  return request({
+    url: '/system/dept/addRedMoney',
+    method: 'get',
+    params: data
+  })
+}
+
+
+// 查询部门详细
+export function addFlowNum(data) {
+  return request({
+    url: '/system/dept/addFlowNum',
+    method: 'get',
+    params: data
+  })
+}

BIN
src/assets/logo/czt.png


+ 1 - 2
src/store/modules/user.js

@@ -9,8 +9,7 @@ const user = {
     avatar: '',
     roles: [],
     permissions: [],
-    isAdmin: false,
-    medicalMallConfig: {medicalMall: false,statics: false,audit:false,resource:false,stores:false}
+    isAdmin: false
   },
 
   mutations: {

+ 0 - 1
src/views/company/companyTraffic/index.vue

@@ -230,7 +230,6 @@ export default {
 
       listTrafficRecords(this.queryParams).then(response => {
         this.trafficRecordList = response.rows;
-        console.log(this.trafficRecordList)
         this.total = response.total;
         this.loading = false;
       });

+ 4 - 3
src/views/company/companyTrafficLog/index.vue

@@ -262,9 +262,10 @@ export default {
       this.single = selection.length !== 1
       this.multiple = !selection.length
     },
-
-    companyNameFormatter(row){
-      return this.formatterCompanyOptions.filter(item => item.dictValue === row.companyId)[0].dictLabel
+    companyNameFormatter(row) {
+      if (!row.companyId) return '';
+      const company = this.formatterCompanyOptions.find(item => item.dictValue === row.companyId);
+      return company ? company.dictLabel : '';
     },
 
     /** 导出按钮操作 */

+ 76 - 3
src/views/course/coursePlaySourceConfig/index.vue

@@ -205,6 +205,9 @@
             />
           </el-select>
         </el-form-item>
+        <el-form-item label="所属部门" prop="createDeptId">
+          <treeselect v-model="form.createDeptId" :options="deptOptions" :normalizer="normalizer"  placeholder="选择上级部门"   :disabled="(username !== 'admin' && title === '修改小程序配置')"  />
+        </el-form-item>
         <el-form-item label="是否是互医/商城小程序" prop="isMall">
           <el-select
             v-model="form.isMall"
@@ -268,11 +271,18 @@ import {list, get, update, add, del} from '@/api/course/coursePlaySourceConfig'
 import {updateIsTownOn} from "@/api/system/config";
 import { allList } from '@/api/company/company'
 import { resetForm } from '@/utils/common'
-
+import Treeselect from "@riophae/vue-treeselect";
+import {listDept} from "@/api/system/dept";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { getUserProfile } from "@/api/system/user";
 export default {
   name: 'CoursePlaySourceConfig',
+  components: {Treeselect},
   data() {
     return {
+      username:null,
+      // 部门树选项
+      deptOptions: [],
       switchDialogVisible: false,
       // 公司搜索相关
       companySearchLoading: false,
@@ -356,6 +366,13 @@ export default {
       this.formatterCompanyOptions = e.rows;
     });
     this.getList();
+    listDept().then(response => {
+      this.deptOptions = this.handleTree(response.data, "deptId");
+    });
+    getUserProfile().then(response => {
+      const data = response.data;
+      this.username = data.userName;
+    });
   },
   methods: {
     resetForm,
@@ -364,7 +381,35 @@ export default {
       this.companyOptions = [];
       this.open = false;
     },
-
+    /** 转换部门数据结构 */
+    normalizer(node) {
+      if (node.hasOwnProperty('id') && !node.hasOwnProperty('deptId')) {
+        return {
+          id: node.id,
+          label: this.getDeptNameById(node.id) || '未知部门',
+          children: node.children || []
+        };
+      }
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.deptId,
+        label: node.deptName,
+        children: node.children
+      };
+    },
+    getDeptNameById(targetId) {
+      const deptOptions =this.deptOptions
+      console.log("text:"+JSON.stringify(deptOptions))
+      for (let i = 0; i < deptOptions.length; i++) {
+        const dept = deptOptions[i];
+        if (dept.deptId === targetId) {
+          return dept.deptName;
+        }
+      }
+      return '未知部门';
+    },
 
     // 处理开关配置
     handleSwitchConfig(row) {
@@ -394,6 +439,34 @@ export default {
       let company = this.formatterCompanyOptions.filter(item => item.dictValue === row.companyId)[0];
       return company ? company.dictLabel : '';
     },
+    departmentNameFormatter(row) {
+      // 容错处理:检查必要参数
+      if (!this.deptOptions || !this.deptOptions.length || !row.deptId) {
+        return '';
+      }
+
+      // 使用 deptId 匹配(与表格 prop 保持一致)
+      const targetId = String(row.deptId);
+
+      // 递归查找树形结构中的部门
+      const findDept = (depts) => {
+        for (const dept of depts) {
+          // 先检查当前节点
+          if (String(dept.deptId) === targetId) {
+            return dept;
+          }
+          // 如果有子节点,递归查找
+          if (dept.children && dept.children.length > 0) {
+            const found = findDept(dept.children);
+            if (found) return found;
+          }
+        }
+        return null;
+      };
+
+      const dept = findDept(this.deptOptions);
+      return dept?.deptName || '';
+    },
 
     // 获取开关配置
     getSwitchConfig(appId) {
@@ -524,7 +597,7 @@ export default {
         secret: null,
         img: null,
         originalId: null,
-        token: 'cbnd7lJvkripVOpyTFAna6NAWCxCrvC',
+        token: 'Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC',
         aesKey: 'HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E',
         msgDataFormat: 'JSON',
         type: '1'

+ 5 - 1
src/views/course/videoResource/index.vue

@@ -673,6 +673,9 @@
         <div class="project-list">
           <div class="filter-container">
             <el-form :inline="true" :model="projectQueryParams" ref="projectForm">
+              <el-form-item>
+                <el-input prefix-icon="el-icon-search" @input="searchProjects" v-model="projectQueryParams.sort" placeholder="请输入题目序号" clearable size="small" />
+              </el-form-item>
               <el-form-item>
                 <el-input prefix-icon="el-icon-search" @input="searchProjects" v-model="projectQueryParams.title" placeholder="请输入题目标题" clearable size="small" />
               </el-form-item>
@@ -901,7 +904,8 @@ export default {
         pageSize: 10,
         questionType: null,
         questionSubType: null,
-        title: null
+        title: null,
+        sort: null
       },
       projectLoading: false,
       projectListTotal: 0,

+ 342 - 0
src/views/deptConfigLog/sysDeptConfigLog/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="部门ID" prop="deptId">
+        <el-input
+          v-model="queryParams.deptId"
+          placeholder="请输入部门ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="数据类型" prop="logType">
+        <el-select v-model="queryParams.logType" placeholder="请选择数据类型" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="操作类型" prop="operateType">
+        <el-select v-model="queryParams.operateType" placeholder="请选择操作类型" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="操作数量" prop="num">
+        <el-input
+          v-model="queryParams.num"
+          placeholder="请输入操作数量"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作前数量" prop="firstNum">
+        <el-input
+          v-model="queryParams.firstNum"
+          placeholder="请输入操作前数量"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作完成后数量" prop="lastNum">
+        <el-input
+          v-model="queryParams.lastNum"
+          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="['deptConfigLog:sysDeptConfigLog: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="['deptConfigLog:sysDeptConfigLog: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="['deptConfigLog:sysDeptConfigLog: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="['deptConfigLog:sysDeptConfigLog:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="sysDeptConfigLogList" @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="部门ID" align="center" prop="deptId" />
+      <el-table-column label="数据类型" align="center" prop="logType" />
+      <el-table-column label="操作类型" align="center" prop="operateType" />
+      <el-table-column label="操作数量" align="center" prop="num" />
+      <el-table-column label="操作前数量" align="center" prop="firstNum" />
+      <el-table-column label="操作完成后数量" align="center" prop="lastNum" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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="['deptConfigLog:sysDeptConfigLog:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['deptConfigLog:sysDeptConfigLog: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"
+    />
+
+    <!-- 添加或修改系统部门资源配置使用记录对话框 -->
+    <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="deptId">
+          <el-input v-model="form.deptId" placeholder="请输入部门ID" />
+        </el-form-item>
+        <el-form-item label="数据类型" prop="logType">
+          <el-select v-model="form.logType" placeholder="请选择数据类型">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="操作类型" prop="operateType">
+          <el-select v-model="form.operateType" placeholder="请选择操作类型">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="操作数量" prop="num">
+          <el-input v-model="form.num" placeholder="请输入操作数量" />
+        </el-form-item>
+        <el-form-item label="操作前数量" prop="firstNum">
+          <el-input v-model="form.firstNum" placeholder="请输入操作前数量" />
+        </el-form-item>
+        <el-form-item label="操作完成后数量" prop="lastNum">
+          <el-input v-model="form.lastNum" placeholder="请输入操作完成后数量" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listSysDeptConfigLog, getSysDeptConfigLog, delSysDeptConfigLog, addSysDeptConfigLog, updateSysDeptConfigLog, exportSysDeptConfigLog } from "@/api/deptConfigLog/sysDeptConfigLog";
+
+export default {
+  name: "SysDeptConfigLog",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 系统部门资源配置使用记录表格数据
+      sysDeptConfigLogList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        deptId: null,
+        logType: null,
+        operateType: null,
+        num: null,
+        firstNum: null,
+        lastNum: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询系统部门资源配置使用记录列表 */
+    getList() {
+      this.loading = true;
+      listSysDeptConfigLog(this.queryParams).then(response => {
+        this.sysDeptConfigLogList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        deptId: null,
+        logType: null,
+        operateType: null,
+        num: null,
+        firstNum: null,
+        lastNum: null,
+        createTime: null,
+        createBy: null,
+        updateTime: null,
+        updateBy: null,
+        remark: 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 = "添加系统部门资源配置使用记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getSysDeptConfigLog(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) {
+            updateSysDeptConfigLog(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addSysDeptConfigLog(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 delSysDeptConfigLog(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有系统部门资源配置使用记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportSysDeptConfigLog(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 12 - 13
src/views/his/company/index.vue

@@ -97,7 +97,7 @@
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table height="660" v-loading="loading" border :data="companyList" @selection-change="handleSelectionChange">
+    <el-table v-loading="loading" border :data="companyList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="ID" align="center" prop="companyId"/>
       <el-table-column label="企业名" align="center" prop="companyName"/>
@@ -118,9 +118,9 @@
       </el-table-column>
       <el-table-column label="管理员账号" align="center" prop="userName"/>
       <el-table-column label="限制用户数量" align="center" prop="limitUserCount"/>
-      <el-table-column label="限制pad数量" align="center" prop="maxPadNum" :formatter="padNumFormatter" v-if="this.$store.state.user.medicalMallConfig.resource"/>
-      <el-table-column label="占用pad数量" align="center" prop="usedNum" v-if="this.$store.state.user.medicalMallConfig.resource"/>
-      <el-table-column label="所属部门" align="center" prop="deptId" v-if="this.$store.state.user.medicalMallConfig.resource">
+      <el-table-column label="限制pad数量" align="center" prop="maxPadNum" :formatter="padNumFormatter" v-if="medicalMallConfig.resource"/>
+      <el-table-column label="占用pad数量" align="center" prop="usedNum" v-if="medicalMallConfig.resource"/>
+      <el-table-column label="所属部门" align="center" prop="deptId" v-if="medicalMallConfig.resource">
         <template slot-scope="scope">
           <el-tag prop="deptId" v-for="(item, index) in deptOptions" :key="'deptId'+index"
                   v-if="scope.row.deptId===item.deptId"
@@ -212,7 +212,7 @@
           </el-select>
         </el-form-item>
         <!-- 所属部门 -->
-        <el-form-item label="所属部门" prop="deptId" v-if="this.$store.state.user.medicalMallConfig.resource">
+        <el-form-item label="所属部门" prop="deptId" v-if="medicalMallConfig.resource">
           <el-select
             v-model="form.deptId"
             placeholder="请选择"
@@ -239,7 +239,7 @@
         <el-form-item label="员工数量" prop="limitUserCount">
           <el-input-number v-model="form.limitUserCount" :min="1" :max="10000"></el-input-number>
         </el-form-item>
-        <el-form-item label="pad数量" prop="maxPadNum" v-if="this.$store.state.user.medicalMallConfig.resource">
+        <el-form-item label="pad数量" prop="maxPadNum" v-if="medicalMallConfig.resource">
           <el-input-number v-model="form.maxPadNum" :min="-1" :max="10000"></el-input-number>
           <span class="pad-tips">
             注:-1表示不做限制
@@ -555,6 +555,7 @@ export default {
       },
       followDoctorList: [],
       cateList: [],
+      medicalMallConfig: {},
       // 表单参数
       form: {
         restartTime: '13:10',
@@ -658,13 +659,11 @@ export default {
     listDept().then(response => {
       this.deptOptions = response.data
     })
-    // getConfigByKey("courseMa.config").then(response => {
-    //   if(response.data && response.data.configValue) {
-    //     this.miniAppList = JSON.parse(response.data.configValue);
-    //   } else {
-    //     this.miniAppList = [];
-    //   }
-    // });
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.medicalMallConfig = JSON.parse(response.data.configValue);
+      }
+    });
     docList().then(response => {
       this.doctor = response.rows
     })

+ 24 - 15
src/views/hisStore/components/storeDetails.vue

@@ -98,68 +98,66 @@
         <el-descriptions-item label="营业执照有效期" >
           <span v-if="item!=null">{{item.businessLicenseExpireStart}} - {{item.businessLicenseExpireEnd}}</span>
         </el-descriptions-item>
-        <div v-if="this.$store.state.user.medicalMallConfig.medicalMall">
-        <el-descriptions-item label="药品经营许可证" >
+        <el-descriptions-item label="药品经营许可证" v-if="medicalMallConfig.isMedicalMall">
           <el-image
             style="width: 100px"
             :src="item.drugLicense"
             :preview-src-list="[item.drugLicense]">
           </el-image>
         </el-descriptions-item>
-        <el-descriptions-item label="药品经营许可证有效期" >
+        <el-descriptions-item label="药品经营许可证有效期" v-if="medicalMallConfig.isMedicalMall">
           <span v-if="item!=null">{{item.drugLicenseExpiryStart}} - {{item.drugLicenseExpiryEnd}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="1类器械生产" >
+        <el-descriptions-item label="1类器械生产" v-if="medicalMallConfig.isMedicalMall">
           <el-image
             style="width: 100px"
             :src="item.medicalDevice1"
             :preview-src-list="[item.medicalDevice1]">
           </el-image>
         </el-descriptions-item>
-        <el-descriptions-item label="1类器械生产有效期" >
+        <el-descriptions-item label="1类器械生产有效期" v-if="medicalMallConfig.isMedicalMall">
           <span v-if="item!=null">{{item.medicalDevice1ExpiryStart}} - {{item.medicalDevice1ExpiryEnd}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="2类器械备案" >
+        <el-descriptions-item label="2类器械备案" v-if="medicalMallConfig.isMedicalMall">
           <el-image
             style="width: 100px"
             :src="item.medicalDevice2"
             :preview-src-list="[item.medicalDevice2]">
           </el-image>
         </el-descriptions-item>
-        <el-descriptions-item label="2类器械备案有效期" >
+        <el-descriptions-item label="2类器械备案有效期" v-if="medicalMallConfig.isMedicalMall">
           <span v-if="item!=null">{{item.medicalDevice2ExpiryStart}} - {{item.medicalDevice2ExpiryEnd}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="3类器械营业许可证" >
+        <el-descriptions-item label="3类器械营业许可证" v-if="medicalMallConfig.isMedicalMall">
           <el-image
             style="width: 100px"
             :src="item.medicalDevice3"
             :preview-src-list="[item.medicalDevice3]">
           </el-image>
         </el-descriptions-item>
-        <el-descriptions-item label="3类器械营业许可证有效期" >
+        <el-descriptions-item label="3类器械营业许可证有效期" v-if="medicalMallConfig.isMedicalMall">
           <span v-if="item!=null">{{item.medicalDevice3ExpiryStart}} - {{item.medicalDevice3ExpiryEnd}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="食品许可证" >
+        <el-descriptions-item label="食品许可证" v-if="medicalMallConfig.isMedicalMall">
           <el-image
             style="width: 100px"
             :src="item.foodLicense"
             :preview-src-list="[item.foodLicense]">
           </el-image>
         </el-descriptions-item>
-        <el-descriptions-item label="食品许可证有效期" >
+        <el-descriptions-item label="食品许可证有效期" v-if="medicalMallConfig.isMedicalMall">
           <span v-if="item!=null">{{item.foodLicenseExpiryStart}} - {{item.foodLicenseExpiryEnd}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="药品许可证" >
+        <el-descriptions-item label="药品许可证" v-if="medicalMallConfig.isMedicalMall">
           <el-image
             style="width: 100px"
             :src="item.medicalLicense"
             :preview-src-list="[item.medicalLicense]">
           </el-image>
         </el-descriptions-item>
-        <el-descriptions-item label="药品许可证有效期" >
+        <el-descriptions-item label="药品许可证有效期" v-if="medicalMallConfig.isMedicalMall">
           <span v-if="item!=null">{{item.medicalLicenseExpiryStart}} - {{item.medicalLicenseExpiryEnd}}</span>
         </el-descriptions-item>
-        </div>
 
 
 
@@ -180,7 +178,7 @@
           <el-button type="primary" @click="handleUpdate(-1)">审核退回</el-button>
         </div>
       </div>
-      <div v-if="item.isAudit!==0 && this.$store.state.user.medicalMallConfig.medicalMall" class="dialog">
+      <div v-if="item.isAudit!==0 && medicalMallConfig.isAudit" class="dialog">
         <el-divider content-position="left">审核记录</el-divider>
         <el-table :data="item.auditLogs" border >
           <el-table-column label="描述" align="center" prop="des" :show-overflow-tooltip="true" />
@@ -211,6 +209,7 @@
 
 <script>
 import { audit, getStore, getStoreAuditLog } from '@/api/hisStore/store'
+import { getConfigByKey } from '@/api/system/config'
 export default {
   name: 'user',
   props:['data'],
@@ -220,6 +219,7 @@ export default {
       statusOptions: [],
       // 审核状态字典
       isAuditOptions: [],
+      medicalMallConfig:{},
       item:null,
       logoUrl:[],
       form: {
@@ -234,6 +234,11 @@ export default {
     }
   },
   created() {
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.medicalMallConfig = JSON.parse(response.data.configValue);
+      }
+    });
     this.getDicts('sys_company_status').then(response => {
       this.statusOptions = response.data
     })
@@ -246,6 +251,10 @@ export default {
     this.form1 = {}
   },
   methods: {
+    _console(param){
+      console.log(param)
+      return true;
+    },
     getDetails(orderId,showAudit) {
       if(showAudit === 0) {
         this.showAudit = false

+ 8 - 2
src/views/hisStore/store/audit.vue

@@ -116,7 +116,7 @@
 
       <el-table-column label="登录帐号" align="center" prop="account" width="150px" />
       <el-table-column label="创建时间" align="center" prop="createTime"  width="150px"/>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="130px" v-if="this.$store.state.user.medicalMallConfig.medicalMall">
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="130px" v-if="medicalMallConfig.isAudit">
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -168,6 +168,7 @@
 import { audit,listStore, exportStore } from "@/api/hisStore/store";
 import storeDetails from '../components/storeDetails.vue';
 import {getCitys} from "@/api/store/city";
+import { getConfigByKey } from '@/api/system/config'
 export default {
   name: "adutstore",
   components: { storeDetails },
@@ -177,7 +178,7 @@ export default {
         title:"店铺详情",
         open:false,
       },
-
+      medicalMallConfig:{},
       citys:[],
       licenseuploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
@@ -260,6 +261,11 @@ export default {
   created() {
     this.getCitys();
     this.getList();
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.medicalMallConfig = JSON.parse(response.data.configValue);
+      }
+    });
     this.getDicts("sys_company_status").then(response => {
       this.statusOptions = response.data;
     });

+ 47 - 45
src/views/hisStore/store/index.vue

@@ -313,7 +313,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <div v-if="this.$store.state.user.medicalMallConfig.medicalMall">
+        <div v-if="medicalMallConfig.isMedicalMall">
           <el-row>
             <el-col :span="12">
               <el-form-item label="药品经营许可证上传" prop="drugLicense">
@@ -574,6 +574,7 @@
 import { listStore, getStore, delStore, addStore, updateStore, exportStore, refreshPasWod } from '@/api/hisStore/store'
 import storeDetails from '../components/storeDetails.vue';
 import {getCitys} from "@/api/store/city";
+import { getConfigByKey } from '@/api/system/config'
 export default {
   name: "Store",
   components: { storeDetails },
@@ -584,6 +585,7 @@ export default {
         open: false,
       },
       shippingType: [],
+      medicalMallConfig:{},
       citys: [],
       licenseuploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
@@ -650,6 +652,24 @@ export default {
         businessLicense: [
           { required: true, message: "营业执照不能为空", trigger: "blur" }
         ],
+        drugLicense:[
+          { required: true, message: "药品经营许可证不能为空", trigger: "blur" }
+        ],
+        drugLicenseExpiry:[
+          { required: true, message: "药品经营许可证有效期不能为空", trigger: "blur" }
+        ],
+        medicalLicense:[
+          { required: true, message: "医疗机构执业许可证不能为空", trigger: "blur" }
+        ],
+        medicalLicenseExpiry:[
+          { required: true, message: "医疗机构执业许可证有效期不能为空", trigger: "blur" }
+        ],
+        medicalDevice2:[
+          { required: true, message: "2类医疗器械备案证不能为空", trigger: "blur" }
+        ],
+        medicalDevice2Expiry:[
+          { required: true, message: "2类医疗器械备案证有效期不能为空", trigger: "blur" }
+        ],
         logoUrl: [
           { required: true, message: "店铺LOGO不能为空", trigger: "blur" }
         ],
@@ -723,6 +743,11 @@ export default {
   created() {
     this.getCitys();
     this.getList();
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.medicalMallConfig = JSON.parse(response.data.configValue);
+      }
+    });
     this.getDicts("sys_company_status").then(response => {
       this.statusOptions = response.data;
     });
@@ -913,52 +938,29 @@ export default {
           this.form.deliveryType = JSON.stringify(this.form.deliveryType)
         }
 
-        // 处理日期范围字段
-        if (this.form.drugLicenseExpiryStart && this.form.drugLicenseExpiryEnd) {
-          this.form.drugLicenseExpiry = [
-            this.form.drugLicenseExpiryStart,
-            this.form.drugLicenseExpiryEnd
-          ];
-        }
+        // 确保正确处理所有日期范围字段
+        const dateFields = [
+          'drugLicenseExpiry',
+          'medicalDevice1Expiry',
+          'medicalDevice2Expiry',
+          'medicalDevice3Expiry',
+          'foodLicenseExpiry',
+          'medicalLicenseExpiry',
+          'businessLicenseExpire'
+        ];
 
-        if (this.form.medicalDevice1ExpiryStart && this.form.medicalDevice1ExpiryEnd) {
-          this.form.medicalDevice1Expiry = [
-            this.form.medicalDevice1ExpiryStart,
-            this.form.medicalDevice1ExpiryEnd
-          ];
-        }
-        if (this.form.medicalDevice2ExpiryStart && this.form.medicalDevice2ExpiryEnd) {
-          this.form.medicalDevice2Expiry = [
-            this.form.medicalDevice2ExpiryStart,
-            this.form.medicalDevice2ExpiryEnd
-          ];
-        }
-        if (this.form.medicalDevice3ExpiryStart && this.form.medicalDevice3ExpiryEnd) {
-          this.form.medicalDevice3Expiry = [
-            this.form.medicalDevice3ExpiryStart,
-            this.form.medicalDevice3ExpiryEnd
-          ];
-        }
-
-        if (this.form.foodLicenseExpiryStart && this.form.foodLicenseExpiryEnd) {
-          this.form.foodLicenseExpiry = [
-            this.form.foodLicenseExpiryStart,
-            this.form.foodLicenseExpiryEnd
-          ];
-        }
+        dateFields.forEach(field => {
+          const startField = field + 'Start';
+          const endField = field + 'End';
 
-        if (this.form.medicalLicenseExpiryStart && this.form.medicalLicenseExpiryEnd) {
-          this.form.medicalLicenseExpiry = [
-            this.form.medicalLicenseExpiryStart,
-            this.form.medicalLicenseExpiryEnd
-          ];
-        }
-        if (this.form.businessLicenseExpireStart && this.form.businessLicenseExpireEnd) {
-          this.form.businessLicenseExpire = [
-            this.form.businessLicenseExpireStart,
-            this.form.businessLicenseExpireEnd
-          ];
-        }
+          if (this.form[startField] && this.form[endField]) {
+            // 使用 $set 确保响应式更新
+            this.$set(this.form, field, [
+              this.form[startField],
+              this.form[endField]
+            ]);
+          }
+        });
 
       });
     },

+ 49 - 44
src/views/hisStore/storeProduct/index.vue

@@ -47,7 +47,7 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="所属店铺" v-if="this.isStores">
+      <el-form-item label="所属店铺" v-if="medicalMallConfig.isStores">
         <el-select style="width: 240px" v-model="queryParams.storeIds" placeholder="请选择店铺" clearable size="small" >
           <el-option
             v-for="item in storeOptions"
@@ -57,7 +57,7 @@
           />
         </el-select>
       </el-form-item>
-      <div v-if="this.isMedicalMall">
+      <div v-if="medicalMallConfig.isAudit">
       <el-form-item label="审核状态">
         <el-select style="width: 240px" v-model="queryParams.isAudit" placeholder="请选择审核状态" size="small" >
           <el-option value="0" label="待审核" key="isAudit0">待审核</el-option>
@@ -306,7 +306,7 @@
       <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
       <el-table-column label="分类" align="center" prop="cateName" />
       <el-table-column label="所属公司" align="center" prop="companyName" />
-      <el-table-column label="所属店铺" align="center" prop="storeName" v-if="this.isStores"/>
+      <el-table-column label="所属店铺" align="center" prop="storeName" v-if="medicalMallConfig.isStores"/>
       <el-table-column label="售价" align="center" prop="price" >
         <template slot-scope="scope" >
           <span v-if="scope.row.price!=null">{{scope.row.price.toFixed(2)}}</span>
@@ -454,7 +454,7 @@
           <el-form-item label="药品展示图" prop="drugImage">
             <Material v-model="drugImageArr" type="image" :num="1" :width="150" :height="150" />
           </el-form-item>
-          <div v-if="this.isMedicalMall">
+          <div v-if="medicalMallConfig.isMedicalMall">
           <el-row>
             <el-col :span="12">
               <el-form-item label="药品注册证书编号" prop="drugRegCertNo">
@@ -847,7 +847,7 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="所属店铺" prop="storeId" v-if="this.isStores">
+        <el-form-item label="所属店铺" prop="storeId" v-if="medicalMallConfig.isStores">
           <el-select style="width: 240px" v-model="form.storeId" placeholder="请选择店铺" clearable size="small" >
             <el-option
               v-for="item in storeOptions"
@@ -929,6 +929,7 @@ import Material from '@/components/Material'
 import singleImg from '@/components/Material/single'
 import { getCompanyList } from "@/api/company/company";
 import { listStore } from '@/api/hisStore/store'
+import { getConfigByKey } from '@/api/system/config'
 export default {
   name: "HisStoreProduct",
   components: {
@@ -937,6 +938,48 @@ export default {
     Material,
     singleImg,
   },
+  created() {
+    this.getDicts("store_product_tui_cate").then((response) => {
+      this.productTuiCateOptions = response.data;
+    });
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.medicalMallConfig = JSON.parse(response.data.configValue);
+      }
+    });
+    this.getDicts("store_product_enable").then((response) => {
+      this.isNewOptions = response.data;
+      this.isBestOptions = response.data;
+      this.isHotOptions = response.data;
+      this.isGoodOptions=response.data;
+      this.isDisplayOptions=response.data;
+    });
+    this.getDicts("store_product_type").then((response) => {
+      this.productTypeOptions = response.data;
+      if(!this.medicalMallConfig.isMedicalMall &&
+      this.productTypeOptions.length === 4){
+        //删除后两项
+        this.productTypeOptions.splice(2,2);
+      }
+    });
+    this.getDicts("store_product_is_show").then((response) => {
+      this.isShowOptions = response.data;
+    });
+    getAllShippingTemplates().then(response => {
+      this.templateList =response.data;
+    });
+    getAllStoreProductRule().then(response => {
+      this.ruleList =response.data;
+    });
+    getCompanyList().then(response => {
+      this.companyOptions = response.data;
+    });
+    listStore().then(response => {
+      this.storeOptions = response.rows;
+    });
+    this.getTreeselect();
+    this.getList();
+  },
   watch: {
     imageArr: function(val) {
       this.form.image = val.join(',')
@@ -950,8 +993,7 @@ export default {
   },
   data() {
     return {
-      isMedicalMall: this.$store.state.user.medicalMallConfig.medicalMall,
-      isStores: this.$store.state.user.medicalMallConfig.stores,
+      medicalMallConfig:{},
       companyId: null,
       storeId: null,
       isAudit: null,
@@ -1166,43 +1208,6 @@ export default {
       }
     };
   },
-  created() {
-    this.getDicts("store_product_tui_cate").then((response) => {
-      this.productTuiCateOptions = response.data;
-    });
-    this.getDicts("store_product_enable").then((response) => {
-      this.isNewOptions = response.data;
-      this.isBestOptions = response.data;
-      this.isHotOptions = response.data;
-      this.isGoodOptions=response.data;
-      this.isDisplayOptions=response.data;
-    });
-    this.getDicts("store_product_type").then((response) => {
-      this.productTypeOptions = response.data;
-      if(!this.isMedicalMall &&
-      this.productTypeOptions.length === 4){
-        //删除后两项
-        this.productTypeOptions.splice(2,2);
-      }
-    });
-    this.getDicts("store_product_is_show").then((response) => {
-      this.isShowOptions = response.data;
-    });
-    getAllShippingTemplates().then(response => {
-      this.templateList =response.data;
-    });
-    getAllStoreProductRule().then(response => {
-      this.ruleList =response.data;
-    });
-    getCompanyList().then(response => {
-      this.companyOptions = response.data;
-    });
-    listStore().then(response => {
-      this.storeOptions = response.rows;
-    });
-    this.getTreeselect();
-    this.getList();
-  },
   methods: {
     cancel1(){
       this.open1 = false;

+ 30 - 1
src/views/hisStore/storeProductCategory/index.vue

@@ -10,6 +10,12 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="所属店铺" prop="storeId" v-if="medicalMallConfig.isStores">
+        <el-select v-model="queryParams.storeId" placeholder="请选择所属店铺" clearable size="small">
+          <el-option v-for="item in storeList" :key="item.storeId" :label="item.storeName" :value="item.storeId">
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item>
 	    <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -37,6 +43,7 @@
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
     >
       <el-table-column label="分类名称" align="left" prop="cateName" />
+      <el-table-column label="所属店铺" align="center" prop="storeId" :formatter="storeNameFormatter" v-if="medicalMallConfig.isStores"/>
       <el-table-column  label="状态" align="center" prop="isShow">
         <template slot-scope="scope">
           <div>
@@ -99,6 +106,8 @@ import { listStoreProductCategory, getStoreProductCategory, delStoreProductCateg
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import Material from '@/components/Material'
+import { listStoreOptions } from '@/api/hisStore/store'
+import { getConfigByKey } from '@/api/system/config'
 export default {
   name: "HisStoreProductCategory",
   components: {
@@ -112,6 +121,8 @@ export default {
   },
   data() {
     return {
+      storeList: {},
+      medicalMallConfig: {},
       picArr: [],
       // 遮罩层
       loading: true,
@@ -132,7 +143,8 @@ export default {
         sort: null,
         pic: null,
         isShow: null,
-        isDel: null
+        isDel: null,
+        storeId: null
       },
       // 表单参数
       form: {},
@@ -152,8 +164,25 @@ export default {
   },
   created() {
     this.getList();
+    listStoreOptions().then(response => {
+      this.storeList = response.data;
+    });
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.medicalMallConfig = JSON.parse(response.data.configValue);
+      }
+    });
   },
   methods: {
+    storeNameFormatter(row){
+      if(row){
+        const option = this.storeList.find(item => item.storeId === row.storeId);
+        if(option){
+          return option.storeName
+        }
+      }
+      return row.storeId === null ? '总公司' : '未知';
+    },
     /** 查询商品分类列表 */
     getList() {
       this.loading = true;

+ 9 - 1
src/views/index.vue

@@ -233,7 +233,7 @@
           </el-radio-group>
         </div>
         <div class="action-group">
-          <div v-if="this.$store.state.user.medicalMallConfig.statics">
+          <div v-if="medicalMallConfig.statics">
             <!-- 选择部门 -->
             <el-select v-model="deptId" placeholder="请选择部门" size="small" @change="handleDeptChange" style="width: 150px">
               <el-option
@@ -549,6 +549,7 @@ import {
 import dayjs from 'dayjs';
 import { listDept } from '@/api/system/dept'
 import { listCompany } from '@/api/his/company'
+import { getConfigByKey } from '@/api/system/config'
 
 
 const viewCharOption = {
@@ -883,6 +884,7 @@ export default {
   components: {CountTo},
   data() {
     return {
+      medicalMallConfig:{},
       deptInitOptions:[],
       deptOptions:[],
       intiDeptId:this.$store.state.user.user.deptId,
@@ -1000,6 +1002,12 @@ export default {
         this.getCompanyOptions(this.intiDeptId);
       });
     });
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.medicalMallConfig = JSON.parse(response.data.configValue);
+        console.log(this.medicalMallConfig)
+      }
+    });
   },
   methods: {
     getDeptOptions(deptId) {

+ 3 - 3
src/views/qw/qwCompany/index.vue

@@ -191,9 +191,9 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="企业可信IP" >
-          <div>42.194.245.189;119.29.195.254;129.204.130.233;43.138.187.210;129.204.76.229;159.75.239.132119.29.249.66;122.152.230.82</div>
-        </el-form-item>
+<!--        <el-form-item label="企业可信IP" >-->
+<!--          <div>42.194.245.189;119.29.195.254;129.204.130.233;43.138.187.210;129.204.76.229;159.75.239.132119.29.249.66;122.152.230.82</div>-->
+<!--        </el-form-item>-->
         <el-form-item label="聊天工具栏跳转地址" prop="chatToolbar">
           <el-input v-model="form.chatToolbar" placeholder="请输入聊天工具栏跳转地址" />
         </el-form-item>

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

@@ -1423,6 +1423,15 @@
             </el-switch>
           </el-form-item>
 
+          <el-form-item label="是否开启部门数据限制" prop="deptLimit">
+            <el-switch
+              v-model="form18.deptLimit"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+            >
+            </el-switch>
+          </el-form-item>
+
           <el-form-item label="评级开启全部" prop="isAllratingRating">
             <el-switch
               v-model="form18.isAllratingRating"
@@ -2128,6 +2137,89 @@
           </div>
         </el-form>
       </el-tab-pane>
+
+      <el-tab-pane label="个性化功能开关配置" name="medicalMall.func.switch">
+        <el-form ref="form27" :model="form27" label-width="150px">
+          <el-form-item label="商城店铺、商品是否审核" prop="isAudit">
+            <el-switch
+              v-model="form27.isAudit"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+            >
+            </el-switch>
+          </el-form-item>
+          <el-form-item label="商品修改不重新审核字段" prop="productColumns" v-if="form27.isAudit">
+            <el-select v-model="form27.productColumns"
+                       filterable
+                       multiple
+                       clearable
+                       placeholder="请选择字段"
+                       size="small"
+                       style="width: 500px">
+              <el-option
+                v-for="column in storeProductScrmColumns"
+                :key="column.colName"
+                :label="column.colComment"
+                :value="column.colName"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="店铺修改不重新审核字段" prop="storeColumns" v-if="form27.isAudit">
+          <el-select v-model="form27.storeColumns"
+                     filterable
+                     multiple
+                     clearable
+                     placeholder="请选择字段"
+                     size="small"
+                     style="width: 500px">
+            <el-option
+              v-for="column in storeScrmColumns"
+              :key="column.colName"
+              :label="column.colComment"
+              :value="column.colName"
+            >
+            </el-option>
+          </el-select>
+          </el-form-item>
+          <el-form-item label="是否药品商城" prop="isMedicalMall">
+            <el-switch
+              v-model="form27.isMedicalMall"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+            >
+            </el-switch>
+          </el-form-item>
+          <el-form-item label="是否启用资源配置" prop="isResource">
+            <el-switch
+              v-model="form27.isResource"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+            >
+            </el-switch>
+          </el-form-item>
+          <el-form-item label="是否启用首页按照部门、公司展示按钮" prop="statics">
+            <el-switch
+              v-model="form27.statics"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+            >
+            </el-switch>
+          </el-form-item>
+          <el-form-item label="是否启用多店铺" prop="isStores">
+            <el-switch
+              v-model="form27.isStores"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+            >
+            </el-switch>
+          </el-form-item>
+
+          <div class="footer">
+            <el-button type="primary" @click="submitForm27">提 交</el-button>
+          </div>
+        </el-form>
+      </el-tab-pane>
     </el-tabs>
 
 
@@ -2156,6 +2248,8 @@ import companyMenuConfig from './companyMenuConfig'
 import IntegralConfig from '@/views/system/config/integralConfig.vue'
 import { getCitys } from '@/api/store/city'
 import { listCompany } from '@/api/company/company'
+import { getStoreProductColumns } from '@/api/hisStore/storeProduct'
+import { getStoreColumns } from '@/api/hisStore/store'
 
 export default {
   name: 'Config',
@@ -2174,6 +2268,7 @@ export default {
       courseMaConfigLoading: false,
       courseMaConfigList: [],
       switchDialogVisible: false,
+      deptLimit: false,
       switchForm: {
         appId: '',
         switchStatus: '001'
@@ -2301,6 +2396,9 @@ export default {
           ]
         }
       },
+      form27: {},
+      storeProductScrmColumns:[],
+      storeScrmColumns: [],
       photoArr: [],
       couponList: [],
       inquirySubTypeOptions: [],
@@ -2369,6 +2467,12 @@ export default {
     this.getDicts('sys_integral_log_type').then(response => {
       this.integralLogTypeOptions = response.data
     })
+    getStoreProductColumns().then( response => {
+      this.storeProductScrmColumns = response.data
+    })
+    getStoreColumns().then( response => {
+      this.storeScrmColumns = response.data
+    })
   },
   watch: {
     photoArr: function(val) {
@@ -2707,6 +2811,11 @@ export default {
           if (this.form25.images != null) {
             this.appImages = this.form25.images.split(',')
           }
+        }else if (key == 'medicalMall.func.switch') {
+          this.configId = response.data.configId
+          this.configKey = response.data.configKey
+          this.form27 = {...this.form27, ...JSON.parse(response.data.configValue)}
+          console.log(this.form27)
         }
       })
     },
@@ -2962,6 +3071,18 @@ export default {
         }
       })
     },
+    submitForm27() {
+      const param = { configId: this.configId, configKey: this.configKey, configValue: JSON.stringify(this.form27) }
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess('修改成功')
+        }
+      })
+    },
+    formatColumns(){
+      console.log(this.form27.pass_columns)
+
+    },
     submitForm24() {
       this.$refs['form24'].validate(valid => {
         if (valid) {

+ 166 - 133
src/views/system/dept/index.vue

@@ -58,15 +58,47 @@
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
     >
       <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
+      <el-table-column prop="deptName" label="pad数量" v-if="deptLimit">
+        <template slot-scope="scope">
+          <p style="text-align: center" v-if="scope.row.parentId != 0">
+            {{scope.row.deptConfig && scope.row.deptConfig.padNum !== null ? scope.row.deptConfig.padNum : '未配置'}}
+          </p>
+        </template>
+      </el-table-column>
+      <el-table-column prop="deptName" label="pad已用数量" v-if="deptLimit">
+        <template slot-scope="scope">
+          <p style="text-align: center" v-if="scope.row.parentId != 0">
+            {{scope.row.deptConfig && scope.row.deptConfig.padNumSub !== null ? scope.row.deptConfig.padNumSub : '未配置'}}
+          </p>
+        </template>
+      </el-table-column>
+      <el-table-column prop="deptName" label="到期时间" v-if="deptLimit">
+        <template slot-scope="scope">
+          <p style="text-align: center" v-if="scope.row.parentId != 0">
+            {{scope.row.deptConfig && scope.row.deptConfig.padTime ? scope.row.deptConfig.padTime : '未配置'}}
+          </p>
+        </template>
+      </el-table-column>
+      <el-table-column prop="deptName" label="红包金额" v-if="deptLimit">
+        <template slot-scope="scope">
+          <p style="text-align: center" v-if="scope.row.parentId != 0">
+            {{scope.row.deptConfig && scope.row.deptConfig.redPackage !== null ? scope.row.deptConfig.redPackage : '未配置'}}
+          </p>
+        </template>
+      </el-table-column>
+      <el-table-column prop="deptName" label="剩余流量" v-if="deptLimit">
+        <template slot-scope="scope">
+          <p style="text-align: center" v-if="scope.row.parentId != 0">
+            {{scope.row.deptConfig && scope.row.deptConfig.flowNum !== null ? formatBalance(scope.row.deptConfig.flowNum) : '未配置'}}
+          </p>
+        </template>
+      </el-table-column>
       <el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
       <el-table-column prop="status" label="状态" width="100">
         <template slot-scope="scope">
           <dict-tag :options="statusOptions" :value="scope.row.status"/>
         </template>
       </el-table-column>
-      <el-table-column prop="red" label="红包配额" width="200" v-if="this.isResource"></el-table-column>
-      <el-table-column prop="traffic" label="流量配额" width="200" v-if="this.isResource"></el-table-column>
-      <el-table-column prop="pad" label="坐席配额" width="200" v-if="this.isResource"></el-table-column>
       <el-table-column label="创建时间" align="center" prop="createTime" width="200">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
@@ -84,11 +116,21 @@
           <el-button
             size="mini"
             type="text"
-            icon="el-icon-edit"
-            @click="handleUpdateResource(scope.row)"
-            v-hasPermi="['system:dept:resource']"
-            v-if="scope.row.deptId !== 1"
-          >资源配置</el-button>
+            @click="handleUpdatePad(scope.row)"
+            v-if="scope.row.deptId !== 1 && deptLimit"
+          >配置pad</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleUpdateFlow(scope.row)"
+            v-if="scope.row.deptId !== 1 && deptLimit"
+          >充值流量</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleUpdateRedPackage(scope.row)"
+            v-if="scope.row.deptId !== 1 && deptLimit"
+          >充值红包</el-button>
           <el-button
             size="mini"
             type="text"
@@ -110,81 +152,27 @@
     <!-- 资源配置对话框 -->
     <el-dialog title="部门资源配置" :visible.sync="openResource" width="600px" append-to-body>
       <el-form ref="resourceForm" :model="resourceForm" :rules="resourceRules" label-width="80px">
-        <el-form-item label="部门名称">
-          <el-input v-model="this.targetDeptName"  disabled/>
+        <el-form-item label="pad数量" prop="pad" v-if="resourceForm.type == 0">
+          <el-input type="number" v-model="resourceForm.num" :min=0>
+            <template slot="append">台</template>
+          </el-input>
+        </el-form-item>
+        <!-- 有效时间 时间选择器-->
+        <el-form-item label="PAD有效期" prop="padTime" v-if="resourceForm.type == 0">
+          <el-date-picker
+            v-model="resourceForm.padTime"
+            type="date"
+            placeholder="选择日期"
+            value-format="yyyy-MM-dd"
+            style="width: 100%;"
+          />
+        </el-form-item>
+        <el-form-item label="充值金额" prop="pad" v-if="resourceForm.type != 0">
+          <el-input type="number" v-model="resourceForm.money" :min=0>
+            <template slot="append">元</template>
+          </el-input>
+          <span style="color: #fb1c1c;display: inline-block" v-if="resourceForm.type == 2">{{flowPrice}}元 / GB</span>
         </el-form-item>
-        <el-row :gutter="10">
-          <el-col :span="8">
-            <el-form-item label="红包配额" prop="red" >
-              <el-input-number v-model="resourceForm.red" controls-position="right" disabled/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="充值配额" prop="pad" >
-              <el-input-number v-model="resourceForm.redCharge" controls-position="right" :min=0 />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <!-- 有效时间 时间选择器-->
-            <el-form-item label="有效时间" prop="redEffectiveTime" >
-              <el-date-picker
-                v-model="resourceForm.redEffectiveTime"
-                type="date"
-                placeholder="选择日期"
-                value-format="yyyy-MM-dd"
-                style="width: 100%;"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="10">
-          <el-col :span="8">
-            <el-form-item label="流量配额" prop="traffic" >
-              <el-input-number v-model="resourceForm.traffic" controls-position="right" disabled/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="充值配额" prop="trafficCharge" >
-              <el-input-number v-model="resourceForm.trafficCharge" controls-position="right" :min=0 />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <!-- 有效时间 时间选择器-->
-            <el-form-item label="有效时间" prop="trafficEffectiveTime" >
-              <el-date-picker
-                v-model="resourceForm.trafficEffectiveTime"
-                type="date"
-                placeholder="选择日期"
-                value-format="yyyy-MM-dd"
-                style="width: 100%;"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="10">
-          <el-col :span="8">
-            <el-form-item label="坐席配额" prop="pad" >
-              <el-input-number v-model="resourceForm.pad" controls-position="right" disabled/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="充值配额" prop="padCharge" >
-              <el-input-number v-model="resourceForm.padCharge" controls-position="right" :min=0 />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <!-- 有效时间 时间选择器-->
-            <el-form-item label="有效时间" prop="padEffectiveTime" >
-              <el-date-picker
-                v-model="resourceForm.padEffectiveTime"
-                type="date"
-                placeholder="选择日期"
-                value-format="yyyy-MM-dd"
-                style="width: 100%;"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitResourceForm">确 定</el-button>
@@ -248,16 +236,18 @@
 </template>
 
 <script>
-import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept";
+import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild, updatePadNum, addRedMoney, addFlowNum } from "@/api/system/dept";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import { addOrEditDeptResource, getDeptResource } from '@/api/system/resourceManagement'
+import { getConfigByKey } from '@/api/system/config'
 
 export default {
   name: "Dept",
   components: { Treeselect },
   data() {
     return {
+      isResource:false,
       // 遮罩层
       loading: true,
       // 显示搜索条件
@@ -270,6 +260,7 @@ export default {
       title: "",
       // 是否显示弹出层
       open: false,
+      deptLimit: false,
       // 是否显示资源弹出层
       openResource: false,
       // 操作的部门名称
@@ -280,6 +271,7 @@ export default {
       refreshTable: true,
       // 是否展开
       expand: false,
+      flowPrice: 0,
       // 状态数据字典
       statusOptions: [],
       // 查询参数
@@ -319,28 +311,29 @@ export default {
       },
       // 资源表单参数
       resourceRules: {
-        red: [
-          { required: true, message: "红包配额不能为空", trigger: "blur" }
-        ],
-        traffic: [
-          { required: true, message: "流量配额不能为空", trigger: "blur" }
-        ],
-        pad: [
-          { required: true, message: "坐席配额不能为空", trigger: "blur" }
-        ]
       }
     };
   },
   created() {
     this.getList();
+    this.getConfigKey("statis.config").then(response => {
+      let data = JSON.parse(response.msg)
+      this.flowPrice = data.trafficPrice;
+    });
+    this.getConfigKey("course.config").then(response => {
+      let data = JSON.parse(response.msg)
+      if(data && data.deptLimit){
+        this.deptLimit = true;
+      }
+    });
     this.getDicts("sys_normal_disable").then(response => {
       this.statusOptions = response.data;
     });
-  },
-  computed: {
-    isResource() {
-      return this.$store.state.user.medicalMallConfig?.isResource === '1' || false;
-    }
+    getConfigByKey("medicalMall.func.switch").then(response => {
+      if(response.data && response.data.configValue) {
+        this.isResource = JSON.parse(response.data.configValue).isResource;
+      }
+    });
   },
   methods: {
     /** 查询部门列表 */
@@ -370,7 +363,6 @@ export default {
     // 资源配置取消按钮
     cancelResource() {
       this.openResource = false;
-      this.resetResource();
     },
     // 表单重置
     reset() {
@@ -386,22 +378,6 @@ export default {
       };
       this.resetForm("form");
     },
-    // 表单重置
-    resetResource() {
-      this.resourceForm = {
-        id: undefined,
-        red: undefined,
-        redCharge: undefined,
-        redEffectiveTime: undefined,
-        pad: undefined,
-        padCharge: undefined,
-        padEffectiveTime: undefined,
-        traffic: undefined,
-        trafficCharge: undefined,
-        trafficEffectiveTime: undefined
-      };
-      this.resetForm("resourceForm");
-    },
     /** 搜索按钮操作 */
     handleQuery() {
       this.getList();
@@ -444,12 +420,49 @@ export default {
       });
     },
     /** 修改按钮操作 */
-    handleUpdateResource(row) {
-      this.resetResource();
-      getDeptResource(row.deptId).then(response => {
-        this.resourceForm = response.data;
-        this.openResource = true;
-      });
+    handleUpdatePad(row) {
+      this.openResource = true;
+      this.resourceForm = {
+        type: 0,
+        deptId: row.deptId,
+        num: row?.deptConfig?.padNum || 0,
+        padTime: row?.deptConfig?.padTime || null,
+      }
+    },
+    handleUpdateRedPackage(row) {
+      this.openResource = true;
+      this.resourceForm = {
+        type: 1,
+        deptId: row.deptId,
+        money: 0,
+      }
+    },
+    handleUpdateFlow(row) {
+      this.openResource = true;
+      this.resourceForm = {
+        type: 2,
+        deptId: row.deptId,
+        money: 0,
+      }
+    },
+    formatBalance(flow){
+      //对流量值进行判断,换算成GB或TB
+      if(!flow){
+        return "0 KB";
+      }
+      const absBalance = Math.abs(flow); // 获取绝对值
+      if(absBalance < 1024){
+        return flow + " KB";
+      }
+      else if(absBalance < 1024 * 1024){
+        return (flow / 1024).toFixed(2) + " MB";
+      }
+      else if(absBalance < 1024 * 1024 * 1024){
+        return (flow / (1024 * 1024)).toFixed(2) + " GB";
+      }
+      else{
+        return (flow / (1024 * 1024 * 1024)).toFixed(2) + " TB";
+      }
     },
     /** 提交按钮 */
     submitForm: function() {
@@ -473,19 +486,39 @@ export default {
     },
     /** 资源配置提交*/
     submitResourceForm: function() {
-      this.$refs["resourceForm"].validate(valid => {
-        if (valid) {
-          addOrEditDeptResource(this.resourceForm).then(response => {
-            if(response.code === 200 && response.data === true){
-              this.msgSuccess("修改成功");
-              this.openResource = false;
-              this.getList();
-            }else{
-              this.msgError(response.msg);
-            }
-          });
-        }
-      });
+      if(this.resourceForm.type == 0){
+        updatePadNum(this.resourceForm).then(response => {
+          if(response.code === 200){
+            this.msgSuccess("修改成功");
+            this.openResource = false;
+            this.getList();
+          }else{
+            this.msgError(response.msg);
+          }
+        });
+      }
+      if(this.resourceForm.type == 1){
+        addRedMoney(this.resourceForm).then(response => {
+          if(response.code === 200){
+            this.msgSuccess("修改成功");
+            this.openResource = false;
+            this.getList();
+          }else{
+            this.msgError(response.msg);
+          }
+        });
+      }
+      if(this.resourceForm.type == 2){
+        addFlowNum(this.resourceForm).then(response => {
+          if(response.code === 200){
+            this.msgSuccess("修改成功");
+            this.openResource = false;
+            this.getList();
+          }else{
+            this.msgError(response.msg);
+          }
+        });
+      }
     },
     /** 删除按钮操作 */
     handleDelete(row) {