Browse Source

【JLHWEB】:更新用户权限界面

JohnnyChan 9 months ago
parent
commit
54a881cb80

+ 9 - 9
JLHWEB/index.html

@@ -45,31 +45,31 @@
             preserveAspectRatio="xMidYMid"
           >
             <g transform="translate(20 20)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#ffebcc"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(189, 221, 255, 1)"></rect>
             </g>
             <g transform="translate(50 20)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#ffc266"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(98, 173, 255, 1)"></rect>
             </g>
             <g transform="translate(80 20)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#ff9900"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(35, 131, 235, 1)"></rect>
             </g>
             <g transform="translate(20 50)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#ffc266"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(98, 173, 255, 1)"></rect>
             </g>
             <g transform="translate(50 50)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#ff9900"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(35, 131, 235, 1)"></rect>
             </g>
             <g transform="translate(80 50)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#995c00"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(5, 83, 167, 1)"></rect>
             </g>
             <g transform="translate(20 80)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#ff9900"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(35, 131, 235, 1)"></rect>
             </g>
             <g transform="translate(50 80)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#995c00"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(5, 83, 167, 1)"></rect>
             </g>
             <g transform="translate(80 80)">
-              <rect x="-15" y="-15" width="30" height="30" fill="#331f00"></rect>
+              <rect x="-15" y="-15" width="30" height="30" fill="rgba(0, 48, 99, 1)"></rect>
             </g>
           </svg>
         </div>

+ 12 - 0
JLHWEB/src/api/interface/index.ts

@@ -1046,6 +1046,18 @@ export namespace PrintTemplate {
   }
 }
 
+export namespace Basicinfo {
+  export interface ResUserList {
+    userList: any[];
+  }
+  export interface ResSaveUserList {
+    empid: number;
+  }
+  export interface ResDelUserList {
+    useridList: number[];
+  }
+}
+
 export namespace SalePrice {
   export interface ResPriceList {
     list: any[];

+ 23 - 0
JLHWEB/src/api/modules/basicinfo.ts

@@ -0,0 +1,23 @@
+import { Basicinfo, SalePrice } from "@/api/interface/index";
+import { PORT1 } from "@/api/config/servicePort";
+import http from "@/api";
+
+export const getUserList = () => {
+  return http.post<Basicinfo.ResUserList>(PORT1 + `/GetUserList`, {});
+};
+
+export const saveUserList = (params: Basicinfo.ResUserList) => {
+  return http.post<Basicinfo.ResSaveUserList>(PORT1 + `/SaveUserList`, params);
+};
+
+export const delUserList = (params: Basicinfo.ResUserList) => {
+  return http.post<Basicinfo.ResUserList>(PORT1 + `/DelUserList`, params);
+};
+
+export const getSysFuncPwr = () => {
+  return http.post<SalePrice.ResPriceList>(PORT1 + `/GetSysFuncPwr`, {});
+};
+
+export const getDept = () => {
+  return http.post<SalePrice.ResPriceList>(PORT1 + `/GetDept`, {});
+};

+ 3 - 3
JLHWEB/src/assets/images/login_bg.svg

@@ -1,14 +1,14 @@
 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="100%" height="100%" viewBox="0 0 1400 800">
 
-  <circle cx="90" cy="800" r="180" stroke="#6E0808" fill="#6E0808">
+  <circle cx="90" cy="800" r="180" fill="rgba(0, 48, 99, 1)">
     <animateMotion path="M 0 0 L -40 20 Z" dur="20s" repeatCount="indefinite"/>
   </circle>
 
-  <circle cx="400" cy="600" r="90" stroke="#E29E9E" fill="#E29E9E">
+  <circle cx="400" cy="600" r="90" fill="rgba(189, 221, 255, 1)">
     <animateMotion path="M 0 0 L -10 -10 Z" dur="10s" repeatCount="indefinite"/>
   </circle>
   
-  <circle cx="1200" cy="700" r="400" stroke="#C53D3D" fill="#C53D3D">
+  <circle cx="1200" cy="700" r="400" fill="rgba(53, 150, 255, 1)">
     <animateMotion path="M 10 -10 L -20 10 Z" dur="30s" repeatCount="indefinite"/>
   </circle>
 </svg>

+ 4 - 0
JLHWEB/src/components/LjDetail/index.scss

@@ -4,6 +4,10 @@ $prefix-cls: "#{$namespace}-detail-layout";
   // padding: 0 $space-b2;
   // padding-top: 8px;
 
+  &__wrapper {
+    height: 100%;
+  }
+
   &__header {
     // width: inherit !important;
     &-inner {

+ 15 - 13
JLHWEB/src/components/LjDetail/index.vue

@@ -1,17 +1,19 @@
 <template>
-  <RenderLjDetail v-bind="currentMould" :data="props.data" />
-
-  <SettingWidget v-if="currentMould" v-bind="currentMould" ref="DetailSettingRef" @confirm="toSetDetailBase" />
-  <!-- v-if="toolButton.length && toolButton.indexOf('print') > -1" -->
-  <PrintEditor ref="printEditorRef" @closed="toClosedPrintEditor" />
-  <PrintTemplateSelector
-    ref="printTemplateRef"
-    @newtemplate="toEditPrintTemplate"
-    @edittemplate="toEditPrintTemplate"
-    @preview="toPreviewPrintTemplate"
-    @confirm="toPrintPrintTemplate"
-    @closed="toGetPrinterState"
-  />
+  <div :class="`${prefixCls}__wrapper`">
+    <RenderLjDetail v-bind="currentMould" :data="props.data" />
+
+    <SettingWidget v-if="currentMould" v-bind="currentMould" ref="DetailSettingRef" @confirm="toSetDetailBase" />
+    <!-- v-if="toolButton.length && toolButton.indexOf('print') > -1" -->
+    <PrintEditor ref="printEditorRef" @closed="toClosedPrintEditor" />
+    <PrintTemplateSelector
+      ref="printTemplateRef"
+      @newtemplate="toEditPrintTemplate"
+      @edittemplate="toEditPrintTemplate"
+      @preview="toPreviewPrintTemplate"
+      @confirm="toPrintPrintTemplate"
+      @closed="toGetPrinterState"
+    />
+  </div>
 </template>
 
 <script setup lang="tsx" name="LjDetail">

+ 10 - 1
JLHWEB/src/components/LjHeader/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="lj-define-header flx-justify-between" :class="size">
-    <div class="header-l" :class="{ simple: simple }">
+    <div class="header-l" :class="{ simple: simple, small: size == 'small' }">
       <slot name="title" :textSize="textSize">
         <span :class="textSize">{{ title }}</span>
       </slot>
@@ -119,6 +119,15 @@ const textSizeLabel = computed(() => {
       background: $color-primary-900;
       z-index: 1;
     }
+    &.small::before,
+    &.small::after {
+      width: 10px;
+      height: 10px;
+    }
+
+    &.small::before {
+      left: 4px;
+    }
   }
   // .header-r {
   // }

+ 493 - 0
JLHWEB/src/components/LjViewItem/index.vue

@@ -0,0 +1,493 @@
+<template>
+  <section
+    :class="`lj-infor-item ${keyattr && current == data[keyattr] ? 'is-current' : ''}`"
+    style="cursor: pointer"
+    @click="clickItem"
+  >
+    <RenderHeader v-bind="props" />
+  </section>
+</template>
+
+<script setup lang="tsx" name="SalePriceItem">
+import { ref, watch, onBeforeMount, nextTick, VNode, Component, useSlots } from "vue";
+import { useI18n } from "vue-i18n";
+import { isArray, isFunction, isObject } from "@/utils/is";
+import { Close } from "@element-plus/icons-vue";
+
+// <!-- <RenderWidget v-bind="props" :data="data" /> -->
+interface ItemProps {
+  /**
+   * @description 标题
+   */
+  label?: string;
+  /**
+   * @description 属性值名称
+   */
+  value?: string;
+  /**
+   * @description 图标,支持iconfont |el-icon | render
+   */
+  icon?: string | Component | ((params?: any) => VNode);
+  /**
+   * @description 图标尺寸
+   */
+  iconsize?: string | number;
+  // type?: string; // 'primary' | 'success' | 'info' | 'warning' | 'danger'
+  /**
+   * @description 标签
+   */
+  tag?: ItemProps[];
+  /**
+   * @description tag属性:标签位置
+   */
+  position?: "left" | "right" | any;
+  /**
+   * @description tag属性:属性对象
+   */
+  prop?: any;
+  /**
+   * @description tag属性:枚举类型
+   */
+  enum?: any;
+  // /**
+  //  * @description 标签属性整体
+  //  */
+  // className?: string;
+  /**
+   * @description 标签属性名
+   */
+  textClassName?: string;
+}
+
+// 接收父组件参数并设置默认值
+interface SalePriceItemProps {
+  /**
+   * @argument 图标,支持iconfont |el-icon | render
+   */
+  icon?: string | Component | ((params?: any) => VNode);
+  /**
+   * @description 头部布局,左右布局,最多两层
+   */
+  header?: ItemProps | ItemProps[];
+  /**
+   * @description 头部右侧布局,最多两层
+   */
+  aside?: ItemProps | ItemProps[];
+  /**
+   * @desciption 数据
+   */
+  data: any;
+  /**
+   * @description 当前选中项
+   */
+  current?: any;
+  /**
+   * @description 关键id
+   */
+  keyattr?: any;
+  /**
+   * @description 是否可编辑
+   */
+  editable?: boolean;
+}
+
+const { t } = useI18n();
+const slots = useSlots();
+const props = withDefaults(defineProps<SalePriceItemProps>(), {
+  data: () => {},
+  editable: false
+});
+
+const emit = defineEmits(["clickItem", "delItem"]);
+const clickItem = () => {
+  emit("clickItem", props.data);
+};
+
+const delItem = () => {
+  emit("delItem", props.data);
+};
+
+const getNumber = (value: number | string) => {
+  let matches = value.toString().match(/\d+/);
+  return matches ? Number(matches[0]) : 0;
+};
+
+const getEnumValue = (value: any, enumArr?: any, attr = "label") => {
+  if (!enumArr) return value;
+  let _value = enumArr.find((item: any) => item.value == value);
+  return _value ? _value[attr] : "";
+};
+
+/**
+ * @description 渲染主图标
+ */
+const RenderIcon = (rProp: any, className?: string) => {
+  let iconRender: any = [];
+  let _size = rProp.iconsize ? getNumber(rProp.iconsize) : "";
+  if (rProp.icon) {
+    let _render: any[] = [];
+    switch (typeof rProp?.icon) {
+      case "object":
+        _render.push(
+          <el-icon size={_size} class={className}>
+            {rProp.icon.render()}
+          </el-icon>
+        );
+        break;
+      case "function":
+        _render.push(rProp.icon(props.data));
+        break;
+      case "string":
+        let styleSize = _size ? { fontSize: `${_size}px` } : {};
+        _render.push(<i class={["iconfont", rProp.icon, className]} style={styleSize} />);
+        break;
+    }
+    iconRender.push(_render);
+  }
+  return iconRender;
+};
+
+const RenderTag = (rProp: any) => {
+  let _renderLeft: any[] = [];
+  let _renderRight: any[] = [];
+  if (rProp.tag) {
+    if (isArray(rProp.tag)) {
+      rProp.tag.forEach((item: any, index: number) => {
+        let _type =
+          item?.prop?.type && isFunction(item.prop.type)
+            ? item.prop.type(props.data)
+            : getEnumValue(props.data[item.value], item?.enum, "type");
+        let _label = getEnumValue(props.data[item.value], item?.enum);
+        let _icon = [];
+        if (item.icon) {
+          _icon = RenderIcon(item);
+        }
+        if (_label || !item?.enum) {
+          if (item.position == "right") {
+            _renderRight.push(
+              <>
+                <el-tag {...item.prop} type={_type} disable-transitions={true}>
+                  {_icon}
+                  {item?.enum && _label}
+                </el-tag>
+              </>
+            );
+          } else {
+            _renderLeft.push(
+              <>
+                <el-tag {...item.prop} type={_type} disable-transitions={true}>
+                  {_icon}
+                  {item?.enum && _label}
+                </el-tag>
+              </>
+            );
+          }
+        }
+      });
+    } else if (isObject(rProp.tag)) {
+      let item = rProp.tag;
+      let _type =
+        item?.prop?.type && isFunction(item.prop.type)
+          ? item.prop.type(props.data)
+          : getEnumValue(props.data[item.value], item?.enum, "type");
+      let _label = getEnumValue(props.data[item.value], item?.enum);
+      let _icon = [];
+      if (item.icon) {
+        _icon = RenderIcon(item);
+      }
+      if (_label) {
+        _renderLeft.push(
+          <>
+            <el-tag {...item.prop} type={_type} disable-transitions={true}>
+              {_icon}
+              {item?.enum && _label}
+            </el-tag>
+          </>
+        );
+      }
+    }
+  }
+  return { left: _renderLeft, right: _renderRight };
+};
+
+/**
+ * @description 渲染header-右侧模块aside
+ * @todo 需要根据业务需求,调整右侧模块的布局
+ */
+const RenderAside = (rProp: any) => {
+  let _render: any[] = [];
+  if (rProp.aside) {
+    if (isArray(rProp.aside)) {
+      rProp.aside.forEach((item: any, index: number) => {
+        // 其余显示在第二行
+        let _label = item.label ? <span class="text-f-c text-secondary-text">{item.label}</span> : "";
+        _render.push(
+          <>
+            <aside class="flx-col flx-shrink" style="text-align: right" title={item.label}>
+              <div>{props.data[item.value]}</div>
+              {_label}
+            </aside>
+          </>
+        );
+      });
+    } else if (isObject(rProp.aside)) {
+      let item = rProp.aside;
+      // 第一行,作为主标题
+      let _label = item.label ? <span class="text-f-c text-secondary-text">{item.label}</span> : "";
+      _render.push(
+        <>
+          <aside class="flx-col flx-shrink" style="text-align: right" title={item.label}>
+            <div>{props.data[item.value]}</div>
+            {_label}
+          </aside>
+        </>
+      );
+    }
+  }
+  return _render;
+};
+
+/**
+ * @description 渲染删除按钮
+ * @param rProp
+ */
+const RenderDelBtn = (rProp: any) => {
+  return (
+    <>
+      <div class="flx-shrink flx-center pl-4">
+        <el-button class="del-btn" type="danger" plain size="small" circle icon={Close} onClick={delItem}></el-button>
+      </div>
+    </>
+  );
+};
+
+/**
+ * @description 渲染主图标
+ */
+const RenderHeader = (rProp: any) => {
+  let _render: any[] = [];
+  if (rProp.header) {
+    if (isArray(rProp.header)) {
+      if (rProp.header.length) {
+        let item = rProp.header[0];
+        // 第一行,作为主标题
+        let _icon = [];
+        if (item.icon) {
+          _icon = RenderIcon(item, "mr-4");
+        }
+        // 标签
+        let _tagLeft: any = [],
+          _tagRight: any = [];
+        if (item.tag && item.tag.length) {
+          let _tag = RenderTag(item);
+          _tagLeft = _tag.left;
+          _tagRight = _tag.right;
+        }
+        let _textClassName = item?.textClassName ?? "";
+        let _label = item.label ? <span class="text-body-m text-secondary-text pr-2">{item.label}</span> : "";
+        _render.push(
+          <>
+            <div class="code flx-start text-body-b" title={item.label}>
+              {_tagLeft}
+              {_icon}
+              {_label}
+              <span class={_textClassName}>{props.data[item.value]}</span>
+              {_tagRight}
+            </div>
+          </>
+        );
+      }
+      let _tagRender: any[] = [];
+
+      rProp.header.forEach((item: any, index: number) => {
+        if (index > 0) {
+          // 其余显示在第二行
+          let _icon = [];
+          if (item.icon) {
+            _icon = RenderIcon(item);
+          }
+          // 标签
+          let _tagLeft: any = [],
+            _tagRight: any = [];
+          if (item.tag && item.tag.length) {
+            let _tag = RenderTag(item);
+            _tagLeft = _tag.left;
+            _tagRight = _tag.right;
+          }
+          let _textClassName = item?.textClassName ?? "";
+          let _label = props.data[item.value] !== "" && item.label ? <span class="text-disable pr-2">{item.label}</span> : "";
+          if (_label || _icon.length) {
+            _tagRender.push(
+              <>
+                <span class="text-f-c text-primary-text flx" title={item.label}>
+                  {_tagLeft}
+                  {_icon}
+                  {_label}
+                  <span class={_textClassName}>{props.data[item.value]}</span>
+                  {_tagRight}
+                </span>
+              </>
+            );
+          }
+        }
+      });
+      _tagRender.length &&
+        _render.push(
+          <>
+            <div class="tag-list mt-2">{_tagRender}</div>
+          </>
+        );
+    } else if (isObject(rProp.header)) {
+      let item = rProp.header;
+      // 第一行,作为主标题
+      let _icon = {};
+      if (item.icon) {
+        _icon = RenderIcon(item);
+      }
+      // 标签
+      let _tagLeft: any = [],
+        _tagRight: any = [];
+      if (item.tag && item.tag.length) {
+        let _tag = RenderTag(item);
+        _tagLeft = _tag.left;
+        _tagRight = _tag.right;
+      }
+      let _label = item.label ? <span class="text-body-m text-secondary-text pr-2">{item.label}</span> : "";
+      _render.push(
+        <>
+          <div class="code flx-start" title={item.label}>
+            {_tagLeft}
+            {_icon}
+            {_label}
+            <span>{props.data[item.value]}</span>
+            {_tagRight}
+          </div>
+        </>
+      );
+    }
+  }
+  return (
+    <>
+      <header class="flx-justify-between">
+        <div class="title flx-1 flx-start overflow-hidden">
+          {rProp.icon && <div class="lj-infor-item__avatars flx-center flx-shrink">{RenderIcon(rProp)}</div>}
+          <div class="name flx-col flx-1">{_render}</div>
+        </div>
+        {RenderAside(rProp)}
+        {rProp.editable && RenderDelBtn(rProp)}
+      </header>
+    </>
+  );
+};
+
+// const RenderWidget = (rProp: any) => {
+//   return (
+//     <>
+//       <section
+//         class={`lj-infor-item ${
+//           props.keyattr && props.current && props.current == props.data[props.keyattr] ? "is-current" : ""
+//         }`}
+//         style="cursor: pointer"
+//         onClick={clickItem}
+//       >
+//         {RenderHeader(rProp)}
+//       </section>
+//     </>
+//   );
+// };
+</script>
+
+<style lang="scss" scope>
+/* 通用信息模块布局 */
+.lj-infor-item {
+  position: relative;
+  border-radius: $br-md;
+  overflow: hidden;
+  border: 1px solid $color-gray-4;
+  // transition: all 0.2s ease-in-out;
+  padding: $space-a1 $space-b1;
+  user-select: none;
+
+  box-sizing: border-box;
+
+  & + & {
+    margin-top: $space-a1;
+  }
+
+  &:hover {
+    border-color: $color-primary-300;
+  }
+
+  & > header {
+    position: relative;
+    align-items: stretch;
+
+    .title {
+      .name {
+        height: 100%;
+      }
+      .code {
+        span + span {
+          margin-left: 2px;
+        }
+      }
+      .el-icon {
+        margin-right: $space-a1;
+      }
+    }
+    > aside + aside {
+      margin-left: $space-a2;
+    }
+  }
+
+  // & > main {
+  //   position: relative;
+  //   padding: $space-b1 $space-b2;
+  // }
+
+  &__avatars {
+    width: $space-b4;
+    height: $space-b4;
+    .iconfont {
+      font-size: $space-b3;
+      color: $color-gray-7;
+    }
+  }
+
+  .tag-list {
+    display: flex;
+    span {
+      position: relative;
+    }
+    span + span {
+      margin-left: $space-a1;
+      padding-left: $space-a1;
+    }
+    span:not(.el-tag) + span:not(.el-tag) {
+      &:before {
+        position: absolute;
+        content: "";
+        left: 0;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 1px;
+        height: 12px;
+        background-color: $color-gray-5;
+      }
+    }
+    .iconfont {
+      // margin-right: 2px;
+      font-size: 13px;
+    }
+  }
+  &.is-current {
+    background-color: $color-primary-100;
+
+    .name {
+      .code {
+        color: $color-primary-600;
+      }
+    }
+  }
+}
+</style>

+ 5 - 1
JLHWEB/src/enums/dwnameEnum.ts

@@ -5,5 +5,9 @@ export enum DwnameEnum {
   /**
    * @description 价格表
    */
-  prilcelist = "u_prilcelist"
+  prilcelist = "u_prilcelist",
+  /**
+   * @description 用户权限
+   */
+  userlist = "u_user_jlhprice"
 }

+ 2 - 1
JLHWEB/src/hooks/useDwLayout.tsx

@@ -327,7 +327,8 @@ export const useDwLayout = (
             let _field = scope?.column.field ?? "";
             let _item: any = {};
             scope.enum && (_item = scope.enum.find((item: any) => item.value == Number(_data[_field])));
-            return _item?.label ?? "";
+            // return _item?.label ?? "";
+            return <el-input value={_item?.label} disabled={true} {...item.basicinfo.props} />;
           };
         }
       }

+ 12 - 0
JLHWEB/src/languages/modules/zh-cn/business.json

@@ -409,5 +409,17 @@
         "description": "1.编辑时,可拖拽调整排序;<br/>2.排列在第一的方案,搜索栏折叠时,点击即可触发搜索"
       }
     }
+  },
+  "detail": {
+    "basicTitle": "用户列表",
+    "basicSetting": "基础权限设置",
+    "syspwr": "功能权限",
+    "dept": "部门",
+    "outrep": "业务员",
+    "priceList": "价格表",
+    "edittingQuit": "正在编辑中,退出将放弃修改",
+    "successToEdit": "成功修改用户信息",
+    "successToAdd": "成功新增用户",
+    "delConfirm": "确定要删除用户:"
   }
 }

+ 2 - 1
JLHWEB/src/languages/modules/zh-cn/common.json

@@ -183,5 +183,6 @@
   "notyet": "未开始",
   "overtime": "超时",
   "limittime": "限时",
-  "remain": "剩余"
+  "remain": "剩余",
+  "quit": "退出"
 }

+ 2 - 1
JLHWEB/src/languages/modules/zh-cn/menu.json

@@ -148,5 +148,6 @@
   "workmanship": "工艺加点设置",
   "quoteinquiry": "报价查询",
   "mattressQuote": "床垫报价",
-  "bednetQuote": "床网报价"
+  "bednetQuote": "床网报价",
+  "user": "用户权限"
 }

+ 34 - 0
JLHWEB/src/routers/modules/baseRouter.ts

@@ -356,6 +356,40 @@ export const baseRouter: Menu.MenuOptions[] = [
             }
           }
         ]
+      },
+      {
+        path: "/baseinfo/user",
+        name: "user",
+        component: "/baseinfo/user/index",
+        meta: {
+          icon: "Common_List.png",
+          title: "用户权限",
+          isLink: "",
+          isHide: false,
+          isFull: false,
+          isAffix: false,
+          isKeepAlive: true,
+          isSubMenu: false,
+          activeMenu: "/baseinfo",
+          funid: 114
+        },
+        children: [
+          {
+            path: "/baseinfo/user/detail",
+            name: "userDetail",
+            component: "/baseinfo/user/detail",
+            meta: {
+              icon: "Common_List.png",
+              title: "用户权限详情",
+              isLink: "",
+              isHide: true,
+              isFull: false,
+              isAffix: false,
+              isKeepAlive: true,
+              activeMenu: "/baseinfo/bednetarea"
+            }
+          }
+        ]
       }
     ]
   }

+ 0 - 203
JLHWEB/src/routers/modules/financeRouter.ts

@@ -1,203 +0,0 @@
-import type { Menu } from "@/typings/global";
-/**
- * @argument name 财务
- */
-export const financeRouter: Menu.MenuOptions[] = [
-  {
-    path: "/finance",
-    name: "finance",
-    meta: {
-      icon: "iconcurrency-yen-circle",
-      title: "财务",
-      isLink: "",
-      isHide: false,
-      isFull: false,
-      isAffix: false,
-      isKeepAlive: true,
-      funid: 261
-    },
-    children: [
-      {
-        path: "/finance/receivable",
-        name: "receivable",
-        meta: {
-          icon: "iconcredit-card-down",
-          title: "应收",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 1476
-        },
-        children: [
-          {
-            path: "/finance/receivable/rp",
-            name: "detailedQuery",
-            meta: {
-              // icon: "iconfile-03",
-              title: "明细查询",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 345,
-              isGroup: true
-            },
-            children: [
-              {
-                path: "/finance/receivable/rp/rpMsttake",
-                name: "rpMsttake",
-                component: "/finance/musttake/index",
-                meta: {
-                  icon: "iconbar-chart-07",
-                  title: "应收账龄表",
-                  isLink: "",
-                  isHide: false,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  funid: 1164
-                },
-                children: [
-                  {
-                    path: "/finance/receivable/rp/rpMsttake/detail",
-                    name: "rpMstTakeDetail",
-                    component: "/finance/musttake/detail",
-                    meta: {
-                      icon: "iconclipboard-price",
-                      title: "应收账龄详情",
-                      isLink: "",
-                      isHide: true,
-                      isFull: false,
-                      isAffix: false,
-                      isKeepAlive: true,
-                      activeMenu: "/finance/receivable/rp/rpMsttake"
-                    }
-                  }
-                ]
-              }
-            ]
-          }
-        ]
-      },
-      {
-        path: "/finance/cope",
-        name: "cope",
-        meta: {
-          icon: "iconcredit-card-up",
-          title: "应付",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 1477
-        },
-        children: [
-          {
-            path: "/finance/cope/rp",
-            name: "detailedQuery",
-            meta: {
-              // icon: "iconfile-03",
-              title: "明细查询",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 1479,
-              isGroup: true
-            },
-            children: [
-              {
-                path: "/finance/cope/rp/rpMstpay",
-                name: "rpMstpay",
-                component: "/finance/mustpay/index",
-                meta: {
-                  icon: "iconbar-chart-07",
-                  title: "应付账龄表",
-                  isLink: "",
-                  isHide: false,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  funid: 645
-                },
-                children: [
-                  {
-                    path: "/finance/cope/rp/rpMstpay/detail",
-                    name: "rpMstpayDetail",
-                    component: "/finance/mustpay/detail",
-                    meta: {
-                      icon: "iconclipboard-price",
-                      title: "应付账龄详情",
-                      isLink: "",
-                      isHide: true,
-                      isFull: false,
-                      isAffix: false,
-                      isKeepAlive: true,
-                      activeMenu: "/finance/cope/rp/rpMstpay"
-                    }
-                  }
-                ]
-              }
-            ]
-          }
-        ]
-      },
-      {
-        path: "/finance/rapmoney",
-        name: "rapmoney",
-        meta: {
-          icon: "iconcoins-hand",
-          title: "出纳帐",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 6063
-        },
-        children: [
-          {
-            path: "/finance/rapmoney/rapmoneyMx",
-            name: "rapmoneyMx",
-            component: "/finance/rapmoney2/index",
-            meta: {
-              icon: "iconcoins-hand",
-              title: "出纳明细账",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 6071
-            }
-            // children: [
-            //   {
-            //     path: "/finance/rapmoney/rapmoneyMx/detail",
-            //     name: "rpRapMoneyDetail",
-            //     component: "/finance/rapmoney2/index",
-            //     meta: {
-            //       icon: "iconclipboard-price",
-            //       title: "出纳明细账",
-            //       isLink: "",
-            //       isHide: true,
-            //       isFull: false,
-            //       isAffix: false,
-            //       isKeepAlive: true,
-            //       activeMenu: "/finance/rapmoney"
-            //     }
-            //   }
-            // ]
-          }
-        ]
-      }
-    ]
-  }
-];

+ 0 - 56
JLHWEB/src/routers/modules/planRouter.ts

@@ -1,56 +0,0 @@
-import type { Menu } from "@/typings/global";
-/**
- * @argument name 计划
- */
-export const planRouter: Menu.MenuOptions[] = [
-  {
-    path: "/plan",
-    name: "plan",
-    meta: {
-      icon: "icontarget-04",
-      title: "计划",
-      isLink: "",
-      isHide: false,
-      isFull: false,
-      isAffix: false,
-      isKeepAlive: true,
-      funid: 257
-    },
-    children: [
-      {
-        path: "/mtrldef/mtrlWillRq",
-        name: "mtrlWillRq",
-        component: "/mtrldef/mtrlWillRq/index",
-        meta: {
-          icon: "iconpackage",
-          title: "物料需求",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 6902
-        },
-        children: [
-          {
-            path: "/mtrldef/mtrlWillRqqty",
-            name: "mtrlWillRqqty",
-            component: "/mtrldef/mtrlWillRqqty/index",
-            meta: {
-              icon: "iconpackage-search",
-              title: "物料监控",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              isDisabled: true,
-              funid: 50
-            }
-          }
-        ]
-      }
-    ]
-  }
-];

+ 0 - 71
JLHWEB/src/routers/modules/purchaseRouter.ts

@@ -1,71 +0,0 @@
-import type { Menu } from "@/typings/global";
-/**
- * @argument name  采购
- */
-export const purchaseRouter: Menu.MenuOptions[] = [
-  {
-    path: "/purchase",
-    name: "purchase",
-    meta: {
-      icon: "iconshopping-cart-01",
-      title: "采购",
-      isLink: "",
-      isHide: false,
-      isFull: false,
-      isAffix: false,
-      isKeepAlive: true,
-      funid: 259
-    },
-    children: [
-      {
-        path: "/purchase/price",
-        name: "purchasePrice",
-        meta: {
-          icon: "iconshopping-cart-price",
-          title: "采购价格",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 6920
-        },
-        children: [
-          {
-            path: "/purchase/price/quote",
-            name: "quote",
-            component: "/purchase/supplierQuotation/index",
-            meta: {
-              icon: "iconannotation-price",
-              title: "供应商询价单",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 324
-            },
-            children: [
-              {
-                path: "/purchase/price/quote/detail",
-                name: "quoteDetail",
-                component: "/purchase/supplierQuotation/detail",
-                meta: {
-                  icon: "iconuser-01",
-                  title: "供应商询价单详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/purchase/price"
-                }
-              }
-            ]
-          }
-        ]
-      }
-    ]
-  }
-];

+ 0 - 596
JLHWEB/src/routers/modules/saletaskRouter.ts

@@ -1,596 +0,0 @@
-import type { Menu } from "@/typings/global";
-/**
- * @argument name 销售
- */
-export const saletaskRouter: Menu.MenuOptions[] = [
-  {
-    path: "/saletask",
-    name: "sale",
-    // component: "/saletask/index",
-    meta: {
-      icon: "iconline-chart-up-02",
-      title: "销售",
-      isLink: "",
-      isHide: false,
-      isFull: false,
-      isAffix: false,
-      isKeepAlive: true,
-      activeMenu: "/saletask",
-      funid: 256
-    },
-    children: [
-      {
-        path: "/saletask/cust",
-        name: "cust",
-        component: "/saletask/cust/index",
-        meta: {
-          icon: "iconbriefcase-02",
-          title: "客户关系",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isSubMenu: true,
-          isKeepAlive: true,
-          funid: 855
-        },
-        children: [
-          {
-            path: "/saletask/cust/custCrm",
-            name: "custCrm",
-            component: "/saletask/cust/index",
-            meta: {
-              icon: "iconusers-01",
-              title: "客户档案",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              activeMenu: "/saletask/cust/custCrm",
-              funid: 856
-            },
-            children: [
-              {
-                path: "/saletask/cust/custCrm/detail/:id",
-                name: "custCrmDetail",
-                component: "/saletask/cust/detail",
-                meta: {
-                  icon: "iconuser-01",
-                  title: "客户档案详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/saletask/cust/custCrm"
-                }
-              },
-              {
-                path: "/saletask/cust/custCrm/new",
-                name: "custCrmAdd",
-                component: "/saletask/cust/detail",
-                meta: {
-                  icon: "iconuser-01",
-                  title: "新增客户档案",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/saletask/cust/custCrm"
-                }
-              },
-              {
-                path: "/saletask/cust/custCrm/edit/:id",
-                name: "custCrmEdit",
-                component: "/saletask/cust/detail",
-                meta: {
-                  icon: "iconuser-01",
-                  title: "修改客户档案",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/saletask/cust/custCrm"
-                }
-              }
-            ]
-          }
-        ]
-      },
-      {
-        path: "/salesPrice",
-        name: "salesPrice",
-        meta: {
-          icon: "iconclipboard-price",
-          title: "销售价格",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 3180
-        },
-        children: [
-          {
-            path: "/salesPrice/saleQuoteCrm",
-            name: "saleQuote",
-            component: "/saletask/saleQuote/index",
-            meta: {
-              icon: "iconclipboard-price",
-              title: "销售报价单",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 459
-            },
-            children: [
-              {
-                path: "/salesPrice/saleQuoteCrm/detail",
-                name: "saleQuoteDetail",
-                component: "/saletask/saleQuote/detail",
-                meta: {
-                  icon: "iconclipboard-price",
-                  title: "销售报价单详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/salequote"
-                }
-              },
-              {
-                path: "/salequote/new",
-                name: "salequoteAdd",
-                component: "/outware/detail",
-                meta: {
-                  icon: "iconclipboard-price",
-                  title: "新增销售报价单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/salequote"
-                }
-              },
-              {
-                path: "/salequote/detail/edit/:id",
-                name: "salequoteEdit",
-                component: "/outware/detail",
-                meta: {
-                  icon: "iconclipboard-price",
-                  title: "修改销售报价单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/salequote"
-                }
-              }
-            ]
-          },
-          {
-            path: "/salesPrice/salePrice",
-            name: "salePrice",
-            component: "/saletask/salePrice/index",
-            meta: {
-              icon: "iconcurrency-yen",
-              title: "价格表",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 279
-            }
-          }
-        ]
-      },
-      {
-        path: "/saletask/sale",
-        name: "saletask",
-        meta: {
-          icon: "iconclipboard-sale",
-          title: "销售订单",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isSubMenu: true,
-          isKeepAlive: true,
-          activeMenu: "/saletask",
-          funid: 6884
-        },
-        children: [
-          {
-            path: "/saletask/sale/saletaskCrm",
-            name: "saletask",
-            component: "/saletask/sale/index",
-            meta: {
-              icon: "iconclipboard-sale",
-              title: "销售订单",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              activeMenu: "/saletask/sale/saletaskCrm",
-              funid: 266
-            },
-            children: [
-              {
-                path: "/saletask/sale/saletaskCrm/detail",
-                name: "saleTaskCrmDetail",
-                component: "/saletask/sale/detail",
-                meta: {
-                  icon: "iconclipboard-sale",
-                  title: "销售订单详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/saletask/sale/saletaskCrm"
-                }
-              },
-              {
-                path: "/saletask/sale/saletaskCrm/new",
-                name: "saletaskAdd",
-                component: "/saletask/sale/detail",
-                meta: {
-                  icon: "iconclipboard-sale",
-                  title: "新增销售订单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true
-                }
-              },
-              {
-                path: "/saletask/sale/saletaskCrm/edit",
-                name: "saletaskEdit",
-                component: "/saletask/sale/detail",
-                meta: {
-                  icon: "iconclipboard-sale",
-                  title: "修改销售订单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true
-                }
-              }
-            ]
-          },
-          {
-            path: "/saletask/sale/rp",
-            name: "detailedQuery",
-            meta: {
-              // icon: "iconfile-03",
-              title: "明细查询",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              activeMenu: "/saletask/sale",
-              funid: 6886,
-              isGroup: true
-            },
-            children: [
-              {
-                path: "/saletask/sale/rp/rpSaleSaletask",
-                name: "rpSaleSaletask",
-                component: "/outware/index",
-                meta: {
-                  icon: "iconbar-chart-07",
-                  title: "销售订单统计表",
-                  isLink: "",
-                  isHide: false,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  funid: 15
-                }
-              }
-            ]
-          }
-        ]
-      },
-      {
-        path: "/saletask/export",
-        name: "export",
-        meta: {
-          icon: "iconclipboard-sale",
-          title: "出口业务",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isSubMenu: true,
-          isKeepAlive: true,
-          activeMenu: "/saletask",
-          funid: 6887
-        },
-        children: [
-          {
-            path: "/saletask/export/saletask",
-            name: "exportSaletask",
-            component: "/saletask/export/index",
-            meta: {
-              icon: "iconclipboard-sale",
-              title: "出口销售订单",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              activeMenu: "/saletask/export/saletask",
-              funid: 5507
-            },
-            children: [
-              {
-                path: "/saletask/export/saletask/detail",
-                name: "exportSaletaskDetail",
-                component: "/saletask/export/detail",
-                meta: {
-                  icon: "iconclipboard-sale",
-                  title: "出口销售订单详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/saletask/export/saletask"
-                }
-              },
-              {
-                path: "/saletask/export/saletask/new",
-                name: "exportSaletaskAdd",
-                component: "/saletask/export/detail",
-                meta: {
-                  icon: "iconclipboard-sale",
-                  title: "新增出口销售订单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true
-                }
-              },
-              {
-                path: "/saletask/export/saletask/edit",
-                name: "exportSaletaskEdit",
-                component: "/saletask/export/detail",
-                meta: {
-                  icon: "iconclipboard-sale",
-                  title: "修改出口销售订单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true
-                }
-              }
-            ]
-          }
-        ]
-      },
-      {
-        path: "/orderTracking",
-        name: "orderTracking",
-        meta: {
-          icon: "iconfile-search-02",
-          title: "订单跟踪",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 6889
-        },
-        children: [
-          {
-            path: "/orderTracking/mtrlwareCrm",
-            name: "mtrlwareCrm",
-            component: "/saletask/mtrlware/index",
-            meta: {
-              icon: "iconpackage-search",
-              title: "库存查询",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              activeMenu: "/saletask/mtrlware",
-              funid: 14
-            },
-            children: [
-              {
-                path: "/orderTracking/mtrlwareCrm/detail",
-                name: "mtrlwareCrmDetail",
-                component: "/saletask/mtrlware/detail",
-                meta: {
-                  icon: "iconpackage",
-                  title: "库存查询详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/saletask/mtrlware"
-                }
-              }
-            ]
-          },
-          {
-            path: "/saletaskmxTracking",
-            name: "saletaskmxTracking",
-            component: "/saletask/saletaskmxTracking/index",
-            meta: {
-              icon: "iconclipboard-price",
-              title: "销售订单明细跟踪",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 789
-            }
-          }
-        ]
-      },
-      {
-        path: "/saleAndShipment",
-        name: "saleAndShipment",
-        meta: {
-          icon: "icontruck-01",
-          title: "销售发货",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 6890
-        },
-        children: [
-          {
-            path: "/saleAndShipment/saleOutwareCrm",
-            name: "outwareSale",
-            component: "/saletask/saleOutware/index",
-            meta: {
-              icon: "icontruck-01",
-              title: "销售发货单",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 267
-            },
-            children: [
-              {
-                path: "/saleAndShipment/saleOutwareCrm/detail",
-                name: "outwareSaleDetail",
-                component: "/saletask/saleOutware/detail",
-                meta: {
-                  icon: "icontruck-01",
-                  title: "销售发货单详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/outwareSale"
-                }
-              },
-              {
-                path: "/outwareSale/new",
-                name: "outwareSaleAdd",
-                component: "/outware/detail",
-                meta: {
-                  icon: "icontruck-01",
-                  title: "新增销售发货单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/outwareSale"
-                }
-              },
-              {
-                path: "/outwareSale/detail/edit/:id",
-                name: "outwareSaleEdit",
-                component: "/outware/detail",
-                meta: {
-                  icon: "icontruck-01",
-                  title: "修改销售发货单",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/salequote"
-                }
-              }
-            ]
-          }
-        ]
-      },
-      {
-        path: "/rp",
-        name: "reportAnalysis",
-        meta: {
-          icon: "iconbar-chart-07",
-          title: "报表分析",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          funid: 265
-        },
-        children: [
-          {
-            path: "/saletask/rp/rpSaleSaler",
-            name: "rpSaleSalermx",
-            component: "/saletask/rp/rpSaleSaler/index",
-            meta: {
-              icon: "iconbar-chart-07",
-              title: "业务员销售统计表",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 395
-            }
-          },
-          {
-            path: "/saletask/rp/rpSaleCust",
-            name: "rpSaleCust",
-            component: "/saletask/rp/rpSaleCust/index",
-            meta: {
-              icon: "iconbar-chart-07",
-              title: "客户销售统计表",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 396
-            }
-          },
-          {
-            path: "/saletask/rp/rpSaleMtrl",
-            name: "rpSaleMtrl",
-            component: "/saletask/rp/rpSaleMtrl/index",
-            meta: {
-              icon: "iconbar-chart-07",
-              title: "产品销售统计表",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              funid: 397
-            }
-          }
-        ]
-      }
-    ]
-  }
-];

+ 0 - 73
JLHWEB/src/routers/modules/technologyRouter.ts

@@ -1,73 +0,0 @@
-import type { Menu } from "@/typings/global";
-/**
- * @argument name 技术
- */
-export const technologyRouter: Menu.MenuOptions[] = [
-  {
-    path: "/technology",
-    name: "technology",
-    meta: {
-      icon: "iconcompass",
-      title: "技术",
-      isLink: "",
-      isHide: false,
-      isFull: false,
-      isAffix: false,
-      isKeepAlive: true,
-      funid: 659
-    },
-    children: [
-      {
-        path: "/technology/material",
-        name: "material",
-        meta: {
-          icon: "iconpackage",
-          title: "产品物料",
-          isLink: "",
-          isHide: false,
-          isFull: false,
-          isAffix: false,
-          isKeepAlive: true,
-          isSubMenu: true,
-          activeMenu: "/technology",
-          funid: 6969
-        },
-        children: [
-          {
-            path: "/technology/material/mtrldef",
-            name: "productAndMtrlCrm",
-            component: "/technology/mtrldef/index",
-            meta: {
-              icon: "iconpackage",
-              title: "产品及物料",
-              isLink: "",
-              isHide: false,
-              isFull: false,
-              isAffix: false,
-              isKeepAlive: true,
-              activeMenu: "/technology/material/mtrldef",
-              funid: 367
-            },
-            children: [
-              {
-                path: "/technology/material/mtrldef/detail",
-                name: "productAndMtrlCrmDetail",
-                component: "/technology/mtrldef/detail",
-                meta: {
-                  icon: "iconpackage",
-                  title: "产品及物料详情",
-                  isLink: "",
-                  isHide: true,
-                  isFull: false,
-                  isAffix: false,
-                  isKeepAlive: true,
-                  activeMenu: "/technology/material/mtrldef"
-                }
-              }
-            ]
-          }
-        ]
-      }
-    ]
-  }
-];

+ 1 - 1
JLHWEB/src/styles/common.scss

@@ -113,7 +113,7 @@
 
 /* 文字单行省略号 */
 .sle {
-  overflow: hidden;
+  overflow: idden;
   text-overflow: ellipsis;
   white-space: nowrap;
 }

+ 10 - 0
JLHWEB/src/styles/element.scss

@@ -451,3 +451,13 @@
 .el-notification {
   z-index: 9999 !important; /* 确保通知总是在最顶层 */
 }
+
+/* vxe-table header、footer强制居中 */
+.vxe-table--render-default .vxe-header--column,
+.vxe-table--render-default .vxe-footer--column {
+  text-align: center !important;
+}
+.vxe-table--render-default .vxe-header--column .vxe-cell,
+.vxe-table--render-default .vxe-footer--column .vxe-cell {
+  justify-content: center !important;
+}

+ 5 - 5
JLHWEB/src/styles/loading.scss

@@ -25,27 +25,27 @@
 }
 .block-loading .block-loading-box-warp .block-loading-box-item {
   &:nth-child(1) {
-    background: #ffebcc;
+    background: var(--lj-color-primary-000);
     animation-delay: 0s;
   }
   &:nth-child(2),
   &:nth-child(4) {
-    background: #ffc266;
+    background: var(--lj-color-primary-300);
     animation-delay: 0.1s;
   }
   &:nth-child(3),
   &:nth-child(5),
   &:nth-child(7) {
-    background: #ff9900;
+    background: var(--lj-color-primary-500);
     animation-delay: 0.2s;
   }
   &:nth-child(6),
   &:nth-child(8) {
-    background: #995c00;
+    background: var(--lj-color-primary-700);
     animation-delay: 0.3s;
   }
   &:nth-child(9) {
-    background: #331f00;
+    background: var(--lj-color-primary-900);
     animation-delay: 0.4s;
   }
 }

+ 10 - 11
JLHWEB/src/styles/var/color.scss

@@ -1,17 +1,16 @@
 /* Light global css variable */
 :root {
-  --jlh-bg-color: rgba(145, 28, 18, 1);
   /* Color styles */
-  --lj-color-primary-000: rgba(250, 233, 233, 1);
-  --lj-color-primary-100: rgba(241, 207, 207, 1);
-  --lj-color-primary-200: rgba(226, 158, 158, 1);
-  --lj-color-primary-300: rgba(212, 110, 110, 1);
-  --lj-color-primary-400: rgba(197, 61, 61, 1);
-  --lj-color-primary-500: rgba(183, 13, 13, 1);
-  --lj-color-primary-600: rgba(146, 10, 10, 1);
-  --lj-color-primary-700: rgba(110, 8, 8, 1);
-  --lj-color-primary-800: rgba(73, 5, 5, 1);
-  --lj-color-primary-900: rgba(37, 3, 3, 1);
+  --lj-color-primary-000: rgb(235, 244, 255);
+  --lj-color-primary-100: rgba(189, 221, 255, 1);
+  --lj-color-primary-200: rgba(144, 197, 255, 1);
+  --lj-color-primary-300: rgba(98, 173, 255, 1);
+  --lj-color-primary-400: rgba(53, 150, 255, 1);
+  --lj-color-primary-500: rgba(35, 131, 235, 1);
+  --lj-color-primary-600: rgba(18, 106, 201, 1);
+  --lj-color-primary-700: rgba(5, 83, 167, 1);
+  --lj-color-primary-800: rgba(0, 64, 133, 1);
+  --lj-color-primary-900: rgba(0, 48, 99, 1);
 
   --lj-color-black: rgba(0, 0, 0, 1);
   --lj-color-white: rgba(255, 255, 255, 1);

+ 1 - 1
JLHWEB/src/styles/var/index.scss

@@ -62,7 +62,7 @@ $space-b6: 80px;
   box-shadow: 0px 6px 16px -8px rgba(0, 0, 0, 0.04), 0px 9px 28px rgba(0, 0, 0, 0.03), 0px 12px 48px 16px rgba(0, 0, 0, 0.01);
 }
 
-$primary-bg-color: var(--jlh-bg-color);
+$primary-bg-color: var(--lj-color-primary-500);
 $primary-color: var(--lj-color-primary-500);
 
 $color-black: var(--lj-color-black);

+ 630 - 0
JLHWEB/src/views/baseinfo/user/detail.vue

@@ -0,0 +1,630 @@
+<template>
+  <transition name="fade-slide">
+    <LjDetail
+      name="custCrmDetail"
+      v-show="ifShow"
+      v-if="ifInit"
+      ref="LjDetailRef"
+      v-bind="detailProps"
+      v-model:order-status="orderStatus"
+      :data="mainData"
+      :init-param="mainData[0]"
+      :if-layout-editable="false"
+      :if-fold-layout="false"
+      :search-col="{ xs: 2, sm: 2, md: 2, lg: 2, xl: 2 }"
+      :basic-group-col="{ xs: 2, sm: 2, md: 2, lg: 2, xl: 2 }"
+      :action="orderStatus ? orderEditAction : orderDefaultAction"
+    >
+      <template #baseSetting>
+        <el-row class="w-full h-full basic-inner__body" :gutter="10">
+          <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8" class="h-full overflow-auto">
+            <div class="flx-col">
+              <LjHeader class="flx-shrink" size="small" :title="$t('business.detail.syspwr')">
+                <template #toolButton>
+                  <el-checkbox v-model="ifAllFuncpwr" :indeterminate="isIndeterminate" @change="handleSelectAllFuncpwr">{{
+                    $t("common.table.selectAll")
+                  }}</el-checkbox>
+                </template>
+              </LjHeader>
+              <div class="flx-1">
+                <el-tree
+                  ref="sysFuncPwrTreeRef"
+                  :data="sysFuncPwrData"
+                  :props="defaultProps_sysfunc"
+                  show-checkbox
+                  node-key="funcid"
+                  default-expand-all
+                  :default-checked-keys="defaultCheckedKeys_sysfunc"
+                  :expand-on-click-node="false"
+                  check-on-click-node
+                  @check-change="autoCheckSysFuncPwr"
+                >
+                </el-tree>
+              </div>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8" class="h-full overflow-auto">
+            <LjHeader class="flx-1" size="small" :title="$t('business.detail.outrep')" />
+            <!-- <el-tree
+            ref="outrepRef"
+            :data="userListData"
+            :props="defaultProps_outrep"
+            show-checkbox
+            node-key="empid"
+            default-expand-all
+            :default-checked-keys="defaultCheckedKeys_outrep"
+            :expand-on-click-node="false"
+            check-on-click-node
+          >
+          </el-tree> -->
+
+            <LjVxeTable
+              ref="outrepRef"
+              row-key="key"
+              table-cls="flx-1"
+              :data="userListData"
+              :columns="columns_outrep"
+              :table-props="tableProps"
+              :tool-button="[]"
+              :request-auto="false"
+            >
+            </LjVxeTable>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8" class="h-full overflow-auto">
+            <div class="flx-col h-full">
+              <div class="flx-1 mb-12">
+                <LjHeader size="small" :title="$t('business.detail.dept')" />
+                <!-- <el-tree
+                ref="deptRef"
+                :data="deptData"
+                :props="defaultProps_dept"
+                show-checkbox
+                node-key="deptid"
+                default-expand-all
+                :default-checked-keys="defaultCheckedKeys_dept"
+                :expand-on-click-node="false"
+                check-on-click-node
+              >
+              </el-tree> -->
+
+                <LjVxeTable
+                  ref="deptRef"
+                  row-key="key"
+                  table-cls="flx-1"
+                  :data="deptData"
+                  :columns="columns_dept"
+                  :table-props="tableProps"
+                  :tool-button="[]"
+                  :request-auto="false"
+                >
+                </LjVxeTable>
+              </div>
+              <div class="flx-1">
+                <LjHeader size="small" :title="$t('business.detail.priceList')" />
+                <LjVxeTable
+                  ref="pricelistRef"
+                  row-key="key"
+                  table-cls=""
+                  :data="defaultCheckedKeys_pricelist"
+                  :columns="columns_pricelist"
+                  :table-props="tableProps"
+                  :table-events="tableEvents"
+                  :tool-button="[]"
+                  :request-auto="false"
+                >
+                  <template #edit> 321 </template>
+                </LjVxeTable>
+              </div>
+            </div>
+          </el-col>
+        </el-row>
+      </template>
+    </LjDetail></transition
+  >
+</template>
+
+<script setup lang="tsx" name="userDetail">
+import { ref, watch, reactive, inject, nextTick, computed } from "vue";
+import { DwnameEnum } from "@/enums/dwnameEnum";
+import LjDetail from "@/components/LjDetail/index.vue";
+import { DetailProp } from "@/components/LjDetail/interface";
+import { useI18n } from "vue-i18n";
+import { useHooks } from "./hooks/index";
+import { useAuthButtons } from "@/hooks/useAuthButtons";
+import LjHeader from "@/components/LjHeader/index.vue";
+import LjVxeTable from "@/components/LjVxeTable/index.vue";
+import { cloneDeep } from "lodash-es";
+import { ElMessage } from "element-plus";
+import { saveUserList, delUserList } from "@/api/modules/basicinfo";
+
+interface detailProp {
+  /**
+   * @argument any 页面数据
+   */
+  data?: any;
+  /**
+   * @argument string 请求数据的api ==> 非必传
+   */
+  requestApi?: (params: any) => Promise<any>;
+  /**
+   * @argument any 基础信息,表格展示数据
+   */
+  // columns?: any;
+  /**
+   * @description 是否可编辑
+   */
+  status: "edit" | "new" | string;
+}
+
+const props = withDefaults(defineProps<detailProp>(), {});
+const { t } = useI18n();
+const { columns, columns_pricelist, columns_dept, columns_outrep } = useHooks();
+const { CheckPower, CheckOption, buttonNew, buttonDefault } = useAuthButtons(t);
+
+const mainData = ref([{}]);
+const defaultCheckedKeys_sysfunc = ref([]);
+const defaultCheckedKeys_outrep = ref([]);
+const defaultCheckedKeys_dept = ref([]);
+const defaultCheckedKeys_pricelist = ref([]);
+const selected_pricelist_view = ref([]);
+const selected_pricelist_edit = ref([]);
+
+const ifShow = ref(true);
+const ifInit = ref(true);
+const ifAllFuncpwr = ref(true);
+const isIndeterminate = ref(false);
+
+const defaultProps_sysfunc = {
+  children: "children",
+  label: "menuname"
+};
+const defaultProps_outrep = {
+  label: "username"
+};
+const defaultProps_dept = {
+  label: "deptname"
+};
+const sysFuncPwrTreeRef = ref();
+const outrepRef = ref();
+const deptRef = ref();
+const pricelistRef = ref();
+const LjDetailRef = ref();
+const sysFuncPwrData = inject("sysFuncPwrData", ref([]));
+const deptData = inject("deptData", ref([]));
+const priceListData = inject("priceListData", ref([]));
+const userListData = inject("userListData", ref([]));
+
+const emit = defineEmits(["edit", "del", "cancel", "goto"]);
+
+/**
+ * @description 是否可编辑
+ */
+const orderStatus = ref("");
+
+const orderDefaultAction = [
+  buttonDefault({
+    label: t("common.redo"),
+    icon: "iconRefresh_light",
+    clickFunc: () => {
+      refresh(mainData.value[0]);
+      ElMessage.success(t("sys.api.operationSuccess"));
+    }
+  }),
+  buttonDefault({
+    label: t("common.editText"),
+    icon: "iconuser-edit",
+    clickFunc: () => {
+      if (!CheckPower(122)) {
+        return "你没有【用户权限】的使用权限";
+      }
+      // refresh(mainData.value[0]);
+
+      emit("edit", mainData.value[0]);
+    }
+  }),
+  buttonDefault({
+    label: t("common.delText"),
+    icon: "iconwrong_light",
+    clickFunc: () => {
+      if (!CheckPower(122)) {
+        return "你没有【用户权限】的使用权限";
+      }
+
+      emit("del", mainData.value[0]);
+    }
+  })
+];
+
+const orderEditAction = [
+  buttonDefault({
+    label: t("common.cancelText"),
+    icon: "iconchevron-left",
+    clickFunc: () => {
+      emit("cancel");
+    }
+  }),
+  buttonNew({
+    label: t("common.saveText"),
+    icon: "iconsave-01",
+    clickFunc: async () => {
+      let ls_rightstring = Array(1000).fill("0").join("");
+      let ls_outrepstr = "-1";
+      let ls_deptstr = "-1";
+      let ls_pricelist_seestr = "-1";
+      let ls_pricelist_editstr = "-1";
+
+      /** 权限值 */
+      let current: any = sysFuncPwrTreeRef.value.getCheckedKeys();
+      current.forEach(index => {
+        if (index > 0 && index <= 1000) {
+          ls_rightstring = ls_rightstring.substring(0, index - 1) + "1" + ls_rightstring.substring(index);
+        }
+      });
+
+      /** 业务员 */
+      let ifAllOutrep = outrepRef.value.element.isAllCheckboxChecked();
+      if (!ifAllOutrep) {
+        let selected = outrepRef.value.element.getCheckboxRecords(true);
+        let selectedName = selected.map((item: any) => item.username).join(",");
+        if (selectedName.length > 0) {
+          ls_outrepstr = "," + selectedName + ",";
+        } else {
+          ls_outrepstr = "0";
+        }
+      }
+
+      /** 部门 */
+      let ifAllDept = deptRef.value.element.isAllCheckboxChecked();
+      if (!ifAllDept) {
+        let selected = deptRef.value.element.getCheckboxRecords(true);
+        let selectedName = selected.map((item: any) => item.deptid).join(",");
+        if (selectedName.length > 0) {
+          ls_deptstr = "," + selectedName + ",";
+        } else {
+          ls_deptstr = "0";
+        }
+      }
+      console.log("ls_deptstr :>> ", ls_deptstr);
+
+      /** 价格表 */
+      console.log("defaultCheckedKeys_pricelist.value :>> ", defaultCheckedKeys_pricelist.value);
+      let selected_view = defaultCheckedKeys_pricelist.value.filter(t => t.view);
+      if (!selected_view.length) {
+        ls_pricelist_seestr = "0";
+      } else if (selected_view.length < defaultCheckedKeys_pricelist.value.length) {
+        ls_pricelist_seestr = "," + selected_view.map(t => t.pricelistid).join(",") + ",";
+      }
+      let selected_edit = defaultCheckedKeys_pricelist.value.filter(t => t.edit);
+      if (!selected_edit.length) {
+        ls_pricelist_editstr = "0";
+      } else if (selected_edit.length < defaultCheckedKeys_pricelist.value.length) {
+        ls_pricelist_editstr = "," + selected_edit.map(t => t.pricelistid).join(",") + ",";
+      }
+      console.log("ls_pricelist_seestr :>> ", ls_pricelist_seestr);
+      console.log("ls_pricelist_editstr :>> ", ls_pricelist_editstr);
+
+      console.log("mainData.value :>> ", mainData.value);
+      console.log("LjDetailRef :>> ", LjDetailRef.value.infoParam);
+
+      let initParams = mainData.value[0].empid == 0 ? LjDetailRef.value.infoParam : mainData.value[0];
+      console.log("initParams :>> ", initParams);
+      let res = await saveUserList({
+        userList: [
+          {
+            ...initParams,
+            rightstring: ls_rightstring,
+            outrepstr: ls_outrepstr,
+            deptstr: ls_deptstr,
+            pricelist_seestr: ls_pricelist_seestr,
+            pricelist_editstr: ls_pricelist_editstr
+          }
+        ]
+      });
+      console.log("saveUserList res :>> ", res);
+      if (res) {
+        if (initParams.empid == 0) {
+          ElNotification({
+            title: t("sys.api.operationSuccess"),
+            message: t("business.detail.successToAdd"),
+            type: "success"
+          });
+        } else {
+          ElNotification({
+            title: t("sys.api.operationSuccess"),
+            message: t("business.detail.successToEdit"),
+            type: "success"
+          });
+        }
+        emit("goto", res.empid);
+      }
+    }
+  })
+];
+
+const detailProps = reactive<DetailProp>({
+  dwname: DwnameEnum.userlist,
+  columns: columns,
+  // detailApi: {
+  //   requestApi: getDetailData,
+  //   initParam: initParam.value
+  // },
+  header: {
+    fieldNames: {
+      code: "cuscode",
+      codeLabel: t("table.u_cust.cuscode") + ":",
+      name: "name"
+    },
+    icon: "iconuser-01",
+    // icon: Close
+    // icon: (params: any) => {
+    //   console.log("detailProps params :>> ", params);
+    //   return <i class={"iconfont iconclipboard-check"}></i>;
+    // }
+    tabsProp: {
+      scrollspy: false,
+      sticky: true
+    }
+  },
+  mould: [
+    {
+      id: "baseSetting",
+      type: "table",
+      label: t("business.detail.basicSetting")
+    }
+  ]
+});
+
+/**
+ * @description 提取出所有的 funcid
+ * @param data
+ */
+const extractFuncIds = (data: any) => {
+  let funcIds = [];
+
+  data.forEach(item => {
+    // 添加当前项的 funcid
+    funcIds.push(item.funcid);
+
+    // 如果当前项有子项,则递归处理子项
+    if (item.children && Array.isArray(item.children)) {
+      funcIds = funcIds.concat(extractFuncIds(item.children));
+    }
+  });
+
+  return funcIds;
+};
+
+const allFuncpwrid = computed(() => {
+  return extractFuncIds(sysFuncPwrData.value);
+});
+
+const autoCheckSysFuncPwr = (data: any) => {
+  let current: any = sysFuncPwrTreeRef.value.getCheckedKeys();
+  ifAllFuncpwr.value = allFuncpwrid.value.length == current.length;
+  isIndeterminate.value = current.length > 0 && allFuncpwrid.value.length > current.length;
+};
+
+const handleSelectAllFuncpwr = (val: boolean) => {
+  defaultCheckedKeys_sysfunc.value = val ? allFuncpwrid.value : [];
+  sysFuncPwrTreeRef.value.setCheckedKeys(defaultCheckedKeys_sysfunc.value, true);
+  // ifAllFuncpwr.value = val;
+  isIndeterminate.value = false;
+};
+
+const refresh = (val: any) => {
+  mainData.value = [val];
+  /* 权限值 */
+  if (val.empid == 0 && val.userid) {
+    defaultCheckedKeys_sysfunc.value = allFuncpwrid.value;
+  } else {
+    defaultCheckedKeys_sysfunc.value = val.rightstring
+      .split("")
+      .map((t, idx) => Number(t) > 0 && idx + 1)
+      .filter(t => t);
+  }
+  ifAllFuncpwr.value = allFuncpwrid.value.length == defaultCheckedKeys_sysfunc.value.length;
+  isIndeterminate.value =
+    defaultCheckedKeys_sysfunc.value.length > 0 && allFuncpwrid.value.length > defaultCheckedKeys_sysfunc.value.length;
+  sysFuncPwrTreeRef.value.setCheckedKeys(defaultCheckedKeys_sysfunc.value, true);
+
+  /* 业务员 */
+  // if (val.outrepstr == "-1") {
+  //   // -1: 全选
+  //   defaultCheckedKeys_outrep.value = userListData.value.map(t => t.empid);
+  // } else if (val.outrepstr == "0") {
+  //   // 0: 全不选
+  //   defaultCheckedKeys_outrep.value = [];
+  // } else {
+  //   // 部分选
+  //   let outrepArr = val.outrepstr.split(",").filter(t => t);
+  //   defaultCheckedKeys_outrep.value = userListData.value
+  //     .map(t => outrepArr.includes(t.username) && t)
+  //     .filter(t => t)
+  //     .map(t => t.empid);
+  // }
+  // outrepRef.value.setCheckedKeys(defaultCheckedKeys_outrep.value, true);
+  console.log('val.outrepstr == "-1" :>> ', val.outrepstr == "-1");
+  if (val.outrepstr == "-1") {
+    // -1: 全选
+    // defaultCheckedKeys_outrep.value = cloneDeep(userListData.value);
+    defaultCheckedKeys_outrep.value = userListData.value.filter(t => t.username);
+  } else if (val.outrepstr == "0") {
+    // 0: 全不选
+    defaultCheckedKeys_outrep.value = [];
+  } else {
+    // 部分选
+    let outrepArr = val.outrepstr.split(",").filter(t => t);
+    defaultCheckedKeys_outrep.value = userListData.value.map(t => outrepArr.includes(t.username) && t).filter(t => t);
+  }
+  outrepRef.value.element.clearCheckboxRow();
+  outrepRef.value.element.setCheckboxRow(defaultCheckedKeys_outrep.value, true);
+
+  /* 部门 */
+  // if (val.deptstr == "-1") {
+  //   // -1: 全选
+  //   defaultCheckedKeys_dept.value = deptData.value.map(t => t.deptid);
+  // } else if (val.deptstr == "0") {
+  //   // 0: 全不选
+  //   defaultCheckedKeys_dept.value = [];
+  // } else {
+  //   // 部分选
+  //   defaultCheckedKeys_dept.value = val.deptstr
+  //     .split(",")
+  //     .filter(t => t)
+  //     .map(t => Number(t));
+  // }
+  // deptRef.value.setCheckedKeys(defaultCheckedKeys_dept.value, true);
+
+  if (val.deptstr == "-1") {
+    // -1: 全选
+    defaultCheckedKeys_dept.value = deptData.value.filter(t => t.deptid);
+  } else if (val.deptstr == "0") {
+    // 0: 全不选
+    defaultCheckedKeys_dept.value = [];
+  } else {
+    // 部分选
+    let deptArr = val.deptstr
+      .split(",")
+      .filter(t => t)
+      .map(t => Number(t));
+    console.log("deptArr :>> ", deptArr);
+    defaultCheckedKeys_dept.value = deptData.value.filter(t => deptArr.includes(t.deptid));
+  }
+  deptRef.value.element.clearCheckboxRow();
+  deptRef.value.element.setCheckboxRow(defaultCheckedKeys_dept.value, true);
+
+  /** 价格列表 */
+  if (val.pricelist_seestr == "-1") {
+    // -1: 全选
+    selected_pricelist_view.value = priceListData.value.map(t => t.pricelistid);
+  } else if (val.pricelist_seestr == "0") {
+    // 0: 全不选
+    selected_pricelist_view.value = [];
+  } else {
+    // 部分选
+    let plArr = val.pricelist_seestr.split(",").filter(t => t);
+    selected_pricelist_view.value = priceListData.value
+      .map(t => plArr.includes(t.pricelistname) && t)
+      .filter(t => t)
+      .map(t => t.pricelistid);
+  }
+
+  if (val.pricelist_editstr == "-1") {
+    // -1: 全选
+    selected_pricelist_edit.value = priceListData.value.map(t => t.pricelistid);
+  } else if (val.pricelist_editstr == "0") {
+    // 0: 全不选
+    selected_pricelist_edit.value = [];
+  } else {
+    // 部分选
+    let plArr = val.pricelist_editstr.split(",").filter(t => t);
+    selected_pricelist_edit.value = priceListData.value
+      .map(t => plArr.includes(t.pricelistname) && t)
+      .filter(t => t)
+      .map(t => t.pricelistid);
+  }
+  defaultCheckedKeys_pricelist.value = cloneDeep(priceListData.value);
+  defaultCheckedKeys_pricelist.value.map((item: any) => {
+    item.view = selected_pricelist_view.value.includes(item.pricelistid);
+    item.edit = selected_pricelist_edit.value.includes(item.pricelistid);
+    return item;
+  });
+};
+
+// watch(
+//   () => props.data,
+//   val => {
+//     // ifInit.value = true;
+//     // nextTick(() => {
+//     //   ifShow.value = true;
+//     console.log("props.data, val :>> ", val);
+//     mainData.value = [val];
+
+//     nextTick(() => {
+//       refresh(val);
+//     });
+//     // });
+//   }
+//   // { immediate: true }
+// );
+
+watch(
+  () => props.status,
+  val => {
+    console.log("props.status val :>> ", val);
+    if (val != orderStatus.value) {
+      ifShow.value = false;
+      setTimeout(() => {
+        ifInit.value = false;
+        orderStatus.value = val;
+
+        tableProps.editConfig.enabled = orderStatus.value != "";
+
+        setTimeout(() => {
+          ifInit.value = true;
+          nextTick(() => {
+            ifShow.value = true;
+            nextTick(() => {
+              refresh(props.data);
+            });
+          });
+        }, 100);
+      }, 500);
+    }
+  },
+  { immediate: true, deep: true }
+);
+
+const handleCheckboxChange = (data: any) => {
+  console.log("handleCheckboxChange data :>> ", data);
+  // selected_pricelist.value = data.records;
+};
+
+const tableProps = reactive({
+  height: "",
+  // minHeight: "300px",
+  // maxHeight: "600px",
+  // cellStyle: cellStyle,
+  // headerCellStyle: headerCellStyle,
+  editConfig: { trigger: "click", mode: "cell", enabled: orderStatus.value != "" },
+  checkboxConfig: { trigger: "row" },
+  keepSource: true
+  // keyboardConfig: {
+  //   isChecked: true
+  // }
+});
+
+const tableEvents = {
+  "checkbox-change": handleCheckboxChange,
+  "checkbox-range-change": handleCheckboxChange,
+  "checkbox-all": handleCheckboxChange
+  // "cell-dblclick": handleDBlClickTable,
+  // "cell-click": handleClickTable,
+  // "edit-closed": autoEditClosed
+};
+
+defineExpose({
+  refresh
+});
+</script>
+
+<style lang="scss">
+.longjoe-detail-layout.fold-vertical {
+  display: flex;
+  flex-direction: column;
+
+  .longjoe-detail-layout__tabs {
+    flex: 1;
+    // height: unset;
+    overflow: hidden;
+  }
+}
+
+.basic-inner__body {
+  flex: 1;
+
+  @media screen and (max-width: $screen-md) {
+    flex: unset;
+  }
+}
+</style>

+ 147 - 0
JLHWEB/src/views/baseinfo/user/hooks/index.tsx

@@ -0,0 +1,147 @@
+import { ref, reactive, computed, toRefs, inject } from "vue";
+import { Table } from "@/hooks/interface";
+import { ColumnProps } from "@/components/LjVxeTable/interface";
+import { ALLOW_EDIT_STATE } from "@/config/index";
+
+interface defaultState {
+  /**
+   * @description 单据当前状态
+   */
+  orderStatus: string;
+}
+/**
+ * @description 表格多选数据操作
+ * @param {String} rowKey 当表格可以多选时,所指定的 id
+ * */
+export const useHooks = (t?: any) => {
+  const state = reactive<defaultState>({
+    orderStatus: ""
+  });
+
+  // 表格配置项
+  const columns: ColumnProps<any>[] = [
+    { type: "seq", title: "#", fixed: "left", width: 80 },
+    {
+      field: "userid",
+      title: "用户代号",
+      basicinfo: {
+        el: "input",
+        editable: ALLOW_EDIT_STATE
+      }
+    },
+    {
+      field: "descrp",
+      title: "备注",
+      basicinfo: {
+        el: "input",
+        editable: ALLOW_EDIT_STATE,
+        props: { type: "textarea", rows: 5 },
+        row: 3
+      }
+    },
+    {
+      field: "username",
+      title: "用户名称",
+      basicinfo: {
+        el: "input",
+        editable: ALLOW_EDIT_STATE
+      }
+    },
+    {
+      field: "usermode",
+      title: "用户模式",
+      enum: [
+        { label: "管理员模式", value: 0 },
+        { label: "业务员模式", value: 1 },
+        { label: "经理模式", value: 2 }
+      ],
+      basicinfo: {
+        el: "select",
+        editable: ALLOW_EDIT_STATE,
+        defaultValue: 0
+      }
+    }
+  ];
+
+  const columns_pricelist: ColumnProps<any>[] = [
+    // { type: "checkbox", field: "view", fixed: "left", width: 60 },
+    // { type: "checkbox", field: "edit", fixed: "left", width: 60 },
+    {
+      field: "view",
+      title: "查看",
+      width: 60,
+      basicinfo: {
+        el: "input",
+        editable: ALLOW_EDIT_STATE
+      },
+      render: scope => {
+        let _keys = Object.keys(scope);
+        let _data = _keys.includes("row") ? scope.row : _keys.includes("searchParam") ? scope.searchParam : scope;
+        let editS = inject("orderStatus", ref(""));
+        if (editS.value != "") {
+          return <el-checkbox v-model={_data.view} style="display: block" />;
+        } else {
+          switch (Number(_data.view)) {
+            case 1:
+              return <el-checkbox class={"el-checkbox__disabled-checked"} checked={true} disabled={true} />;
+            default: // 0
+              let bool = false;
+              return <el-checkbox v-model={bool} disabled={true} />;
+          }
+        }
+      }
+    },
+    {
+      field: "edit",
+      title: "修改",
+      width: 60,
+      render: scope => {
+        let _keys = Object.keys(scope);
+        let _data = _keys.includes("row") ? scope.row : _keys.includes("searchParam") ? scope.searchParam : scope;
+        let editS = inject("orderStatus", ref(""));
+        if (editS.value != "") {
+          return <el-checkbox v-model={_data.edit} style="display: block" />;
+        } else {
+          switch (Number(_data.edit)) {
+            case 1:
+              return <el-checkbox class={"el-checkbox__disabled-checked"} checked={true} disabled={true} />;
+            default: // 0
+              let bool = false;
+              return <el-checkbox v-model={bool} disabled={true} />;
+          }
+        }
+      }
+    },
+    {
+      field: "pricelistname",
+      title: "价格表名称",
+      width: "auto"
+    }
+  ];
+
+  const columns_dept: ColumnProps<any>[] = [
+    { type: "checkbox", fixed: "left", width: 60 },
+    {
+      field: "deptname",
+      title: "部门名称",
+      width: "auto"
+    }
+  ];
+
+  const columns_outrep: ColumnProps<any>[] = [
+    { type: "checkbox", fixed: "left", width: 60 },
+    {
+      field: "username",
+      title: "业务员名称",
+      width: "auto"
+    }
+  ];
+
+  return {
+    ...toRefs(state),
+    columns,
+    columns_pricelist,
+    columns_dept,
+    columns_outrep
+  };
+};

+ 352 - 0
JLHWEB/src/views/baseinfo/user/index.vue

@@ -0,0 +1,352 @@
+<template>
+  <el-row :gutter="12" class="userlist w-full h-full">
+    <el-col :span="4" class="h-full overflow-auto">
+      <aside class="userlist__aside">
+        <el-affix
+          target=".userlist__aside"
+          class="userlist__aside-header"
+          :offset="globalStore.assemblySize == 'small' ? 84 : 90"
+        >
+          <LjHeader class="flx-1" :title="$t('business.detail.basicTitle')">
+            <template #toolButton>
+              <el-button type="primary" text :icon="Plus" :disabled="orderStatus != ''" @click="handleAdd">{{
+                $t("common.addText")
+              }}</el-button>
+            </template>
+          </LjHeader>
+          <div class="userlist__aside-searchbox">
+            <el-input v-model="searchInput" size="default" clearable @input="disshow">
+              <template #prefix>
+                <el-icon class="el-input__icon"><Search /></el-icon>
+              </template>
+            </el-input>
+          </div>
+        </el-affix>
+        <el-empty v-if="!userListData.length" :image-size="120" description="暂无数据" />
+        <!-- <LoadingCom /> -->
+        <LjViewItem
+          v-for="(item, index) in showUserList"
+          :key="index"
+          v-bind="fileClassListLayout"
+          keyattr="empid"
+          :current="initParams.empid"
+          :data="item"
+          @click-item="handleSelectItem"
+        />
+      </aside>
+    </el-col>
+
+    <el-col :span="20" class="h-full overflow-auto">
+      <Detail
+        ref="detailRef"
+        :data="mainData"
+        :status="orderStatus"
+        @edit="handleEdit"
+        @cancel="handleCancel"
+        @del="handleDel"
+        @goto="autoGotoUser"
+      />
+    </el-col>
+  </el-row>
+</template>
+
+<script setup lang="tsx" name="saleprice_priclist">
+import { ref, onMounted, provide, nextTick } from "vue";
+import { getUserList, getSysFuncPwr, getDept, delUserList } from "@/api/modules/basicinfo";
+import { getPriceList } from "@/api/modules/saleprice";
+import { ColumnProps } from "@/components/LjVxeTable/interface";
+import LjDrawer from "@/components/LjDrawer/index.vue";
+import Detail from "./detail.vue";
+import { useHooks } from "./hooks/index";
+import LjDialog from "@/components/LjDialog/index.vue";
+import LjHeaderMenu from "@/components/LjHeaderMenu/index.vue";
+import { useI18n } from "vue-i18n";
+import { useAuthButtons } from "@/hooks/useAuthButtons";
+import LjViewItem from "@/components/LjViewItem/index.vue";
+import variables from "@/styles/js.module.scss";
+import { Files, Search, Plus } from "@element-plus/icons-vue";
+import LjHeader from "@/components/LjHeader/index.vue";
+import { useGlobalStore } from "@/stores/modules/global";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { cloneDeep, pick, throttle } from "lodash-es";
+import { pinyinFilterTree } from "@/utils/pinyin";
+
+// const dwname = "web_pricelist";
+const mainData = ref({});
+// const tableProps = {
+//   height: "auto",
+//   editConfig: { trigger: "click", mode: "cell" }
+//   // rowClassName: rowClsNameFunc
+//   // exportConfig: {
+//   //   filename: t("menu.saletaskmx") + formatToDate(new Date(), "YYYY-MM-DD HH:mm:ss")
+//   // }
+// };
+
+const globalStore = useGlobalStore();
+const { t } = useI18n();
+const { orderStatus } = useHooks();
+const { CheckPower, CheckOption, buttonNew, buttonDefault } = useAuthButtons(t);
+provide("orderStatus", orderStatus);
+
+const detailRef = ref();
+const headername = ref("");
+const currentRow = ref<any>({});
+
+const searchInput = ref("");
+const _variables: any = variables;
+const initParams = ref({
+  empid: -1
+});
+const userListData = ref<any>([]);
+const showUserList = ref<any>([]);
+const userListLoading = ref(false);
+provide("userListData", userListData);
+
+const sysFuncPwrData = ref<any>([]);
+provide("sysFuncPwrData", sysFuncPwrData);
+
+const deptData = ref<any>([]);
+provide("deptData", deptData);
+
+const priceListData = ref<any>([]);
+provide("priceListData", priceListData);
+
+// const orderDefaultAction = [
+//   buttonDefault({
+//     label: t("common.cancelText"),
+//     icon: "iconchevron-left",
+//     path: "/saletask/sale/saletaskCrm/new"
+//   }),
+//   buttonNew({
+//     label: t("common.saveText"),
+//     icon: "iconsave-01",
+//     path: "/saletask/sale/saletaskCrm/new"
+//   })
+// ];
+// const orderEditAction = [
+//   buttonNew({
+//     label: t("common.saveText"),
+//     icon: "iconsave-01",
+//     path: "/saletask/sale/saletaskCrm/new"
+//   })
+// ];
+
+const fileClassListLayout = ref<any>({
+  header: [
+    {
+      value: "username"
+    },
+    {
+      value: "descrp",
+      label: "描述"
+    }
+  ],
+  aside: {
+    value: "userid",
+    label: "ID"
+  }
+});
+
+/**
+ * @description 点击列表
+ */
+const handleSelectItem = (data: any) => {
+  let _data = cloneDeep(data);
+  if (orderStatus.value) {
+    ElMessageBox.confirm(t("business.detail.edittingQuit"), t("sys.app.warning"), {
+      confirmButtonText: t("common.quit"),
+      cancelButtonText: t("common.cancelText"),
+      type: "warning"
+    }).then(() => {
+      handleCancel(_data);
+      mainData.value = _data;
+      detailRef.value.refresh(_data);
+      initParams.value.empid = Number(_data.empid);
+    });
+    return;
+  }
+  console.log("handleSelectItem _data :>> ", _data);
+  mainData.value = _data;
+  detailRef.value.refresh(_data);
+  initParams.value.empid = Number(_data.empid);
+  console.log("initParams.value :>> ", initParams.value);
+  // if (!Boolean(Number(data.allow_view))) {
+  //   ElMessage.error("你没有权限查看");
+  //   return false;
+  // }
+  // console.log("handleSelectItem data :>> ", data);
+  // initParams.value.classid = Number(data.classid);
+  // checkAllowPower(data);
+};
+
+/*
+ * @description 抽屉默认属性
+ */
+const drawerDefineProp = {
+  draggable: true,
+  overflow: true,
+  width: "40%"
+  // modalClass: "lj-file-dialog"
+};
+
+const getData = async () => {
+  userListLoading.value = true;
+  let resSysfuncpwr = await getSysFuncPwr();
+  sysFuncPwrData.value = resSysfuncpwr.list;
+
+  let resDept = await getDept();
+  deptData.value = resDept.list;
+
+  let resPricelist = await getPriceList();
+  priceListData.value = resPricelist.list;
+
+  let res = await getUserList();
+  console.log("pricelist res :>> ", res);
+  userListData.value = res.userList;
+  userListLoading.value = false;
+
+  searchEvent();
+};
+
+onMounted(async () => {
+  await getData();
+  handleSelectItem(userListData.value[0]);
+});
+
+// const dataCallback = (data: any) => {
+//   console.log("data :>> ", data);
+//   return {
+//     list: data.userList
+//     // tableinfo: data.tableinfo,
+//     // total: data.totalcnt,
+//     // pageNum: data.pageindex,
+//     // pageSize: data.pagesize
+//   };
+// };
+
+const LjDialogRef = ref();
+const handleDBlClickTable = ({ row, rowIndex, $rowIndex, column, columnIndex, $columnIndex, $event }: any) => {
+  // 弹窗
+  // mainData.value = row;
+  // headername.value = row.username;
+  // orderStatus.value = "edit";
+  // LjDialogRef.value.show();
+};
+
+// 返回绑定的事件
+const tableEvents = {
+  // "cell-dblclick": handleDBlClickTable
+  // "cell-click": handleClickTable
+};
+
+const handleAdd = () => {
+  mainData.value = {
+    empid: 0,
+    userid: "",
+    username: "",
+    descrp: "",
+    usermode: 0,
+    rightstring: "",
+    outrepstr: "",
+    deptstr: "",
+    pricelist_seestr: "",
+    pricelist_editstr: ""
+  };
+
+  orderStatus.value = "new";
+  detailRef.value.refresh(mainData.value);
+  initParams.value.empid = -1;
+};
+
+const handleEdit = (data: any) => {
+  if (data.empid == 0) {
+    ElMessage.error("系统管理员账号,不能修改");
+    return;
+  }
+  orderStatus.value = "edit";
+};
+
+const handleCancel = (data?: any) => {
+  let _data = data ?? mainData.value;
+
+  console.log("_data :>> ", _data, mainData.value);
+  orderStatus.value = "";
+
+  detailRef.value.refresh(_data);
+};
+
+const handleDel = (data: any) => {
+  if (data.empid == 0) {
+    ElMessage.error("系统管理员账号,不能删除");
+    return;
+  }
+  ElMessageBox.confirm(t("business.detail.delConfirm") + data.username + " ?", t("sys.app.warning"), {
+    confirmButtonText: t("common.delText"),
+    cancelButtonText: t("common.cancelText"),
+    type: "error"
+  }).then(async () => {
+    await delUserList({ useridList: [data.empid] });
+
+    await getData();
+    handleSelectItem(userListData.value[0]);
+  });
+};
+
+const autoGotoUser = async (id: number) => {
+  await getData();
+  nextTick(() => {
+    orderStatus.value = "";
+    let item = userListData.value.find(t => t.empid == id);
+    console.log("item :>> ", item);
+    handleSelectItem(item);
+  });
+};
+
+const searchProps = ["username", "userid"];
+// 节流
+const disshow = throttle((val: any) => {
+  searchEvent();
+}, 500);
+
+const searchEvent = () => {
+  const filterVal = String(searchInput.value).trim().toLowerCase();
+  if (filterVal) {
+    showUserList.value = pinyinFilterTree(filterVal, userListData.value, searchProps);
+  } else {
+    showUserList.value = userListData.value;
+  }
+};
+</script>
+
+<style lang="scss">
+.userlist {
+  &__aside {
+    background: $color-gray-1;
+    padding: $space-b2 $space-b2;
+    box-shadow: $shadow-0-down;
+
+    border-radius: $br-md;
+
+    &-searchbox {
+      // padding: $space-b2 $space-b2;
+      // margin-bottom: $space-b2;
+      // background-color: $color-gray-3;
+      // border-radius: $space-b1;
+      margin-bottom: $space-b2;
+
+      .el-form-item--default:last-child {
+        margin-bottom: 0;
+      }
+      .el-input__wrapper {
+        display: flex;
+      }
+    }
+
+    &-header .el-affix--fixed {
+      background: $color-gray-1;
+      padding-top: 12px;
+      // padding-bottom: $space-b2;
+    }
+  }
+}
+</style>

+ 3 - 0
JLHWEB/src/views/saleprice/pricelist/hooks/index.tsx

@@ -24,6 +24,7 @@ export const useHooks = (t?: any) => {
     {
       field: "pricelistname",
       title: "价格表名称",
+      align: "left",
       basicinfo: {
         el: "input",
         editable: ALLOW_EDIT_STATE
@@ -32,6 +33,8 @@ export const useHooks = (t?: any) => {
     {
       field: "dscrp",
       title: "备注",
+      align: "left",
+      width: 300,
       basicinfo: {
         el: "input",
         editable: ALLOW_EDIT_STATE,

+ 14 - 10
JLHWEB/src/views/saleprice/pricelist/index.vue

@@ -27,10 +27,7 @@
     ref="LjDrawerRef"
     class="is-selector"
     v-bind="{
-      ...drawerDefineProp,
-      ...{
-        closeOnPressEscape: initialIndex != -1
-      }
+      ...drawerDefineProp
     }"
     :style="{ padding: 0 }"
   >
@@ -63,6 +60,7 @@ const dwname = "web_pricelist";
 const mainData = ref({});
 const tableProps = {
   height: "auto",
+  showOverflow: false,
   editConfig: { trigger: "click", mode: "cell" }
   // rowClassName: rowClsNameFunc
   // exportConfig: {
@@ -79,17 +77,23 @@ const pricelistname = ref("");
 
 const orderDefaultAction = [
   buttonDefault({
-    label: t("common.cancelText"),
+    label: t("common.editText"),
     icon: "iconchevron-left",
     path: "/saletask/sale/saletaskCrm/new"
   }),
-  buttonNew({
-    label: t("common.saveText"),
-    icon: "iconsave-01",
+  buttonDefault({
+    label: t("common.auditText"),
+    icon: "iconchevron-left",
     path: "/saletask/sale/saletaskCrm/new"
   })
 ];
+
 const orderEditAction = [
+  buttonDefault({
+    label: t("common.cancelText"),
+    icon: "iconchevron-left",
+    path: "/saletask/sale/saletaskCrm/new"
+  }),
   buttonNew({
     label: t("common.saveText"),
     icon: "iconsave-01",
@@ -108,8 +112,8 @@ const drawerDefineProp = {
 };
 
 onMounted(async () => {
-  let res = await getPriceList();
-  console.log("pricelist res :>> ", res);
+  // let res = await getPriceList();
+  // console.log("pricelist res :>> ", res);
 });
 
 const dataCallback = (data: any) => {