Bladeren bron

Merge branch 'master' of http://git.dongkesoft.com:9001/iBOSS-2.0-Mini/iboss-op-mini-web

zhoux 1 jaar geleden
bovenliggende
commit
20ecd73eda

+ 17 - 9
.env.pro

@@ -1,15 +1,23 @@
 NODE_ENV='production'
 VUE_APP_BUILD_TYPE='pro'
-VUE_APP_SERVER_URL='https://scrm.hegii.com/api'
-VUE_APP_EXPORT_URL='http://s.dev01.dkiboss.com:5000/'
-VUE_APP_UPLOAD_URL='https://scrm.hegii.com/api/basic-server/file/upload'
-VUE_APP_LOGS_URL='https://scrm.hegii.com/logs'
-VUE_APP_IMG_URL='https://scrmoss.hegii.com/'
-VUE_APP_HG_IMG_URL='https://hegii-hap.oss-cn-shenzhen.aliyuncs.com/'
-VUE_APP_WEBSOCKET_URL='wss://scrm.hegii.com/websocket/'
+VUE_APP_SERVER_URL='https://zy.op.dkiboss.com/api'
+VUE_APP_UPLOAD_URL='https://zy.op.dkiboss.com/api/mdm-server/file/upload'
+VUE_APP_IMG_URL='https://zy.op.dkiboss.com/file'
+VUE_APP_EXPORT_URL='http://localhost:5000/'
+VUE_APP_EXPORT_SQL_URL='http://zy.op.dkiboss.com/custom-report-sql.sql'
+VUE_APP_LOGS_URL='https://ibossmp.dongkesoft.com:7050/logs'
+VUE_APP_WEBSOCKET_URL='ws://localhost:1015/websocket/'
 VUE_APP_LOGIN_PAGE_NAME=["login"]
 VUE_APP_LOGIN_TYPE=0
+VUE_APP_KUJIALE_URL='https://www.kujiale.com'
+VUE_APP_KUJIALE_API_URL='https://sandbox-openapi.kujiale.com'
 VUE_APP_QV_SCAN_CLIENT_ID='f3ed0d90-3fc8-4eba-b83c-a0cfe54c174d'
-VUE_APP_QV_SCAN_APPID='ww2bc8a1bda0628c66'
-VUE_APP_QV_SCAN_AGENTID='1000005'
+VUE_APP_QV_SCAN_APPID='ww796c5d1684937b2f'
+VUE_APP_QV_SCAN_AGENTID='1000048'
+
+VUE_APP_DK_AUTH_SYS_URL='http://s.dev01.dkiboss.com:8010/login'
+VUE_APP_DK_AUTH_IFRAME_PAGE='http://s.dev01.dkiboss.com:8010/iframe'
+VUE_APP_REDIRECT_URL='http://localhost:8080/auth'
+VUE_APP_DK_AUTH_SYS_SERVER_URL='http://s.dev01.dkiboss.com:8010/api'
+
 

+ 3 - 1
package.json

@@ -64,13 +64,15 @@
     "vue-plugin-hiprint": "0.0.56",
     "vue-printjs": "^1.0.0",
     "vue-property-decorator": "^9.1.2",
+    "vue-quill-editor": "^3.0.6",
     "vue-router": "3.0.0",
     "vue-tour": "^2.0.0",
     "vuedraggable": "^2.24.3",
     "vuex": "^3.0.1",
     "vuex-persistedstate": "^2.5.4",
     "vxe-table": "3.5.9",
-    "xe-utils": "^3.5.7"
+    "xe-utils": "^3.5.7",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "^3.0.1",

+ 23 - 0
src/api/base.js

@@ -104,5 +104,28 @@ export const requestKJL = (url, data, method) => {
   })
 }
 
+export const getDataUpload = (url,data) => {
+  return new Promise((resolve, reject) => {
+    iView.LoadingBar.start()
+    // console.log('store',store)
+    axios.request({
+      url: url,
+      data:data,
+      method: 'post',
+      headers: {
+        'Authorization': "Bearer " + store.state.user.token,
+        'Content-Type': 'multipart/form-data'
+      },
+    }).then(res=>{
+      iView.LoadingBar.finish()
+      return res.data
+    },err => {
+      reject(err)
+    }).then((res) => {
+      resolve(res)
+    })
+  })
+}
+
 
 

+ 21 - 0
src/api/pages/mst/agreement.js

@@ -0,0 +1,21 @@
+/**
+ * @desc   : 协议服务
+ * @author : 常皓宁
+ * @date   : 2024/4/29 13:38
+ */
+export default {
+  agreementService:{
+    prefix: '/mdm-server/mst/agreement/',
+  }
+}
+
+/**
+ * @desc   : 知识库服务
+ * @author : 常皓宁
+ * @date   : 2024/4/29 13:38
+ */
+export const routeUrl = {
+  agreement:{
+
+  }
+}

+ 20 - 0
src/api/pages/mst/company-trade.js

@@ -0,0 +1,20 @@
+/**
+ * @desc   : 交易记录服务
+ * @author : 常皓宁
+ * @date   : 2024/4/29 13:38
+ */
+export default {
+  cpTradeService:{
+    prefix: '/mdm-server/mst/cpTrade/',
+  }
+}
+
+/**
+ * @desc   : 交易记录服务
+ * @author : 常皓宁
+ * @date   : 2024/4/29 13:38
+ */
+export const routeUrl = {
+  cpTrade:{
+  }
+}

+ 3 - 0
src/api/pages/mst/company.js

@@ -12,6 +12,8 @@ export default {
     bindStaff:'bind_staff',
     //解绑
     NoBindStaff:'no_bind_staff',
+    //责任人转让
+    upOwner:'up_owner',
   }
 }
 
@@ -25,5 +27,6 @@ export const routeUrl = {
     add: {key: 'add', routeName: 'company-add'},
     edit: {key:'edit',routeName: 'company-edit'},
     operation:{key:'operation',method:'operation'},
+    upOwner:{key:'upOwner',method:'upOwner'},
   }
 }

+ 22 - 0
src/api/pages/mst/knowledge.js

@@ -0,0 +1,22 @@
+/**
+ * @desc   : 知识库服务
+ * @author : 常皓宁
+ * @date   : 2024/4/29 13:38
+ */
+export default {
+  knowledgeService:{
+    prefix: '/mdm-server/mst/knowledge/',
+  }
+}
+
+/**
+ * @desc   : 知识库服务
+ * @author : 常皓宁
+ * @date   : 2024/4/29 13:38
+ */
+export const routeUrl = {
+  knowledge:{
+    add: {key: 'add', routeName: 'knowledge-add'},
+    edit: {key: 'edit', routeName: 'knowledge-edit'},
+  }
+}

+ 38 - 0
src/api/upload/index.js

@@ -0,0 +1,38 @@
+/**
+ * @desc   : HG文件上传
+ * @author : 洪旭东
+ * @date   : 2022-06-29 09:45
+ */
+import {getDataUpload } from '@/api/base'
+import config from '@/config/index'
+import {request} from "@/api/base";
+// 调用岗位接口服务
+let service
+
+
+class UploadService {
+
+  /**
+   *   @desc   : 单例模式
+   *   @date   : 2022/5/17 15:03
+   *   @author : 寇珊珊
+   */
+  static getInstance() {
+    if (!service) {
+      service = new UploadService()
+    }
+    return service
+  }
+
+  /**
+   * @desc   : 上传
+   * @author : 洪旭东
+   * @date   : 2022-06-29 09:46
+   */
+  upload(file, folder) {
+    return getDataUpload(config.uploadUrl + '?folder=' + folder, file)
+  }
+
+}
+
+export default UploadService.getInstance()

+ 3 - 2
src/components/business/select-magnifier/setting.js

@@ -91,7 +91,7 @@ const data = {
       {itemCode: 'staffName'},
     ],
     // 查询条件一行个数
-    colCount: 4,
+    colCount: 2,
     // 弹窗的宽度
     modalWidth: 600,
     // 列表主键Id
@@ -101,7 +101,8 @@ const data = {
     // 列表列
     columns: [
       {field: 'staffCode', width: '200'},
-      {field: 'staffName', width: '200', title: $t('staff')},
+      {field: 'staffName', width: '200',},
+      {field: 'staffPhone', width: '200',},
       {field: 'orgName', title: $t('orgId')},
     ],
   },

+ 3 - 0
src/components/main/main.vue

@@ -468,6 +468,9 @@ export default {
         event.returnValue = false;
         this.enterFullScreen(); //这里方的是触发全屏的方法
       } else if (event.keyCode === 13) {
+        if (event.target.className=="ql-editor") {
+          return
+        }
         // 如果是多行文本不用拦截
         if (event.target.type != 'textarea') {
           event.returnValue = false;

+ 288 - 0
src/components/sub/QuillEditor/index.vue

@@ -0,0 +1,288 @@
+<template>
+  <!-- 富文本编辑器 -->
+  <div>
+    <!-- 图片视频上传组件辅助-->
+    <div v-show="false">
+      <input
+        name="img"
+        :class="`avatar-uploader${id}`"
+        type="file"
+        multiple
+        accept="image/png, image/jpeg, image/gif, image/jpg"
+        @change="imgUpload"
+      >
+      <input
+        name="video"
+        :class="`video-uploader${id}`"
+        type="file"
+        multiple
+        accept="video/mp4"
+        @change="videoUpload"
+      >
+    </div>
+    <el-row v-loading="quillUpdate" style="height: 100%">
+      <quill-editor
+        :ref="`myQuillEditor${id}`"
+        v-model="editor"
+        class="quill"
+        :options="editorOption"
+        @change="onEditorChange($event)"
+      />
+      <div style="width: 100%;display: flex;justify-content: end;align-items: center;">
+        <span>{{tiLength}}</span>/<span>{{lengthLimit}}</span>
+      </div>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {quillEditor} from 'vue-quill-editor' // 富文本组件
+import { addQuillTitle } from '@/libs/quill-title' // 富文本配置
+// import { newFileUpload } from '@/api/hegii/common' // 上传文件接口
+import UploadService from '@/api/upload' // 上传图片接口和删除图片接口
+import uuidv4 from 'uuid/v4' // webpack自带唯一id生成器
+
+import imageResize  from 'quill-image-resize-module'
+Quill.register('modules/imageResize', imageResize )
+import { ImageDrop } from 'quill-image-drop-module'
+Quill.register('modules/imageDrop', ImageDrop)
+
+export default {
+  name: 'QuillEditor',
+  components: {
+    quillEditor
+  },
+  props: {
+    index: {
+      type: [String, Number],
+      default: ''
+    }, // 当前下标
+    value: {
+      type: String,
+      default: ''
+    }, // 富文本的值
+    lengthLimit:{
+      type:Number,
+      default:1000
+    },
+    prefix: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      tiLength:0,
+      editor: '', // 富文本的值
+      quillUpdate: false, // 富文本加载状态
+      editorOption: {
+        placeholder: '请输入内容',
+        theme: 'snow', // or 'bubble'
+        modules: {
+          toolbar: {
+            container: [
+              ['bold', 'italic', 'underline', 'strike'], // toggled buttons
+              ['blockquote', 'code-block'],
+
+              [{ 'header': 1 }, { 'header': 2 }], // custom button values
+              [{ 'list': 'ordered' }, { 'list': 'bullet' }],
+              [{ 'script': 'sub' }, { 'script': 'super' }], // superscript/subscript
+              [{ 'indent': '-1' }, { 'indent': '+1' }], // outdent/indent
+              [{ 'direction': 'rtl' }], // text direction
+
+              [{ 'size': ['small', false, 'large', 'huge'] }], // custom dropdown
+              [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
+
+              [{ 'color': [] }, { 'background': [] }], // dropdown with defaults from theme
+              [{ 'font': [] }],
+              [{ 'align': [] }],
+              ['link', 'image', 'video'],
+              ['clean'] // remove formatting button
+            ] // 工具栏
+          },
+          imageResize: {
+            displayStyles: {
+              backgroundColor: 'black',
+              border: 'none',
+              color: 'white'
+            },
+            modules: ['Resize', 'DisplaySize', 'Toolbar']
+          }
+        }
+      }, // 富文本配置
+      id: uuidv4() // 唯一id,解决多个富文本在同一页面出现数据同步的问题
+    }
+  },
+  watch: {
+    value(val) { // 更新富文本的值
+      this.editor = val
+    }
+  },
+  created() {
+    // 更新富文本的值
+    this.editor = this.value
+  },
+  mounted() {
+    addQuillTitle()
+    this.$nextTick(() => {
+      this.handleImgAndVideo()
+    })
+  },
+  methods: {
+    // 自定义视频上传和图片上传事件
+    handleImgAndVideo() {
+      const that = this
+      this.$refs[`myQuillEditor${this.id}`].quill.getModule('toolbar').addHandler('video', function(value) {
+        if (value) {
+          document.querySelector(`.video-uploader${that.id} input`).click()
+        } else {
+          that.quill.format('video', false)
+        }
+      })
+      this.$refs[`myQuillEditor${this.id}`].quill.getModule('toolbar').addHandler('image', function(value) {
+        if (value) {
+          document.querySelector(`.avatar-uploader${that.id}`).click()
+        } else {
+          that.quill.format('image', false)
+        }
+      })
+    },
+    // 视频上传
+    async videoUpload(e) {
+      const files = [...e.target.files]
+      if (files.length > 0) this.quillUpdate = true
+      try {
+        for (let i = 0; i < files.length; i++) {
+          let { type } = files[i]
+          if (type !== 'video/mp4') {
+            this.$message.warning('请选择mp4格式的视频文件。')
+            return
+          }
+          const blob = new Blob([files[i]])
+          const name = files[i].name
+          var param = new FormData()
+          param.append(
+            'file',
+            blob,
+            name
+          )
+          type = files[i].type.split('/')[0]
+
+          await UploadService.upload(param, this.prefix).then(video=>{
+            if (video) {
+              const quill = this.$refs[`myQuillEditor${this.id}`].quill
+              const length = quill.selection.savedRange.index
+              quill.insertEmbed(length, type, video.data.absolutelyPath)
+              quill.setSelection(length + 1)
+            }
+          })
+
+          // const video = await newFileUpload(param)
+          // if (video) {
+          //   const quill = this.$refs[`myQuillEditor${this.id}`].quill
+          //   const length = quill.selection.savedRange.index
+          //   quill.insertEmbed(length, type, video.data.oss)
+          //   quill.setSelection(length + 1)
+          // }
+          // loading动画消失
+          if (i === files.length - 1) {
+            this.quillUpdate = false
+          }
+        }
+      } catch {
+        this.quillUpdate = false
+      }
+    },
+    // 富文本值更新触发
+    onEditorChange(e) {
+      if (this.flag) {
+        this.flag = false
+        setTimeout(()=>{
+          this.$refs.myQuillEditor.quill.setSelection(e.html.length + 1)
+          this.tiLength = this.tiLength=e.quill.getLength()-1
+        },20)
+      }
+      this.$emit('editor-content', {value: e.html}) // 触发事件,将富文本框中的值传递出去
+      this.contentValue = e.html
+      e.quill.deleteText(this.lengthLimit,4);
+      if(this.contentValue==''){
+        this.tiLength=0
+      }else{
+        this.tiLength=e.quill.getLength()-1
+      }
+      // 正则替换html的所有img标签
+      // const regex = new RegExp('<img', 'gi')
+      // let html = e.html
+      // html = html.replace(regex, `<img style="max-width: 100%"`)
+      this.$emit('value-change', {
+        index: this.index,
+        value: e.html
+      })
+
+
+
+    },
+    // 图片上传
+    async imgUpload(e) {
+      const files = [...e.target.files]
+      if (files.length > 0) this.quillUpdate = true
+      try {
+        for (let i = 0; i < files.length; i++) {
+          const { type } = files[i]
+          const imgType = type.split('/')[0]
+          if (imgType !== 'image') {
+            this.$message.warning('请上传图片文件。')
+            return
+          }
+          const blob = new Blob([files[i]])
+          const name = files[i].name
+          var param = new FormData()
+          param.append(
+            'file',
+            blob,
+            name
+          )
+
+
+          await UploadService.upload(param, this.prefix).then(image=>{
+            if (image) {
+              const quill = this.$refs[`myQuillEditor${this.id}`].quill
+              const length = quill.selection.savedRange.index
+              quill.insertEmbed(length, imgType, 'https://s.dev01.dkiboss.com:6010/file' + image.data.path)
+              quill.setSelection(length + 1)
+            }
+          })
+
+          // const image = await newFileUpload(param)
+          // if (image) {
+          //   const quill = this.$refs[`myQuillEditor${this.id}`].quill
+          //   const length = quill.selection.savedRange.index
+          //   quill.insertEmbed(length, imgType, image.data.oss)
+          //   quill.setSelection(length + 1)
+          // }
+          // loading动画消失
+          if (i === files.length - 1) {
+            this.quillUpdate = false
+          }
+        }
+      } catch {
+        this.quillUpdate = false
+      }
+    },
+    // 是否禁用富文本
+    onEnableQuill(flag) {
+      this.$refs[`myQuillEditor${this.id}`].quill.enable(flag)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+// .quill {
+//   height: 300px;
+// }
+
+/deep/.ql-editor{
+  height: 550px !important;
+}
+</style>

+ 42 - 0
src/libs/quill-title.js

@@ -0,0 +1,42 @@
+/* eslint-disable */
+const titleConfig = {
+  'ql-bold': '加粗',
+  'ql-color': '颜色',
+  'ql-font': '字体',
+  'ql-code': '插入代码',
+  'ql-italic': '斜体',
+  'ql-link': '添加链接',
+  'ql-background': '背景颜色',
+  'ql-size': '字体大小',
+  'ql-strike': '删除线',
+  'ql-script': '上标/下标',
+  'ql-underline': '下划线',
+  'ql-blockquote': '引用',
+  'ql-header': '标题',
+  'ql-indent': '缩进',
+  'ql-list': '列表',
+  'ql-align': '文本对齐',
+  'ql-direction': '文本方向',
+  'ql-code-block': '代码块',
+  'ql-formula': '公式',
+  'ql-image': '图片',
+  'ql-video': '视频',
+  'ql-clean': '清除字体样式'
+}
+export function addQuillTitle() {
+  const oToolBar = document.querySelector('.ql-toolbar'),
+    aButton = oToolBar.querySelectorAll('button'),
+    aSelect = oToolBar.querySelectorAll('select')
+  aButton.forEach(function (item) {
+    if (item.className === 'ql-script') {
+      item.value === 'sub' ? item.title = '下标' : item.title = '上标'
+    } else if (item.className === 'ql-indent') {
+      item.value === '+1' ? item.title = '向右缩进' : item.title = '向左缩进'
+    } else {
+      item.title = titleConfig[item.classList[0]]
+    }
+  })
+  aSelect.forEach(function (item) {
+    item.parentNode.title = titleConfig[item.classList[0]]
+  })
+}

+ 25 - 0
src/locale/lang/zh-CN.js

@@ -112,6 +112,8 @@ export const button = {
   editItem: '编辑明细',
   addItem: '新建明细',
   layoutSetting: '模板设置',
+  operation:'绑定员工',
+  upOwner:'责任人转让',
 }
 
 /**
@@ -551,6 +553,8 @@ export const columns = {
   cpCode: '企业代码',
   cpName: '企业名称',
   svcCode: '所在服务器',
+  svcIp:'服务IP',
+  svcPort:'服务端口',
   openingDate: '注册日期',
   gradeCode: '系统版本编码',
   gradeName: '系统版本',
@@ -573,6 +577,27 @@ export const columns = {
   appName: '应用名称',
   menuName: '功能名称',
   userPhone:'微信用户电话',
+  wxMaxNum:'微信端员工人数',
+  webMaxNum:'PC端员工人数',
+  opUpdateTime:'更改时间',
+  tradeNo:'交易单号',
+  tradeAmount:'交易金额',
+  tradeTime:'交易时间',
+  tradeType:'交易类型',
+  buyLong:'购买时长',
+  buyBeginDate:'开始日期',
+  buyEndDate:'结束日期',
+  buyGradeCode:'购买版本',
+  extendDays:'延长日期',
+  tradeStatus:'交易状态',
+  wxTradeNo:'微信交易单号',
+  kgName:'知识库名称',
+  kgContent:'知识库内容',
+  packagePrice:'打包价格',
+  webPrice:'PC端价格',
+  wxPrice:'手机端价格',
+  activityItem:'活动明细',
+  activity:'活动总单',
 }
 
 /**

+ 20 - 0
src/router/routers.js

@@ -38,6 +38,26 @@ let menu = [
     component: () => import('@/view/login/qv-login.vue')
   },
   {
+    path: '/knowledge-view',
+    name: 'knowledge-view',
+    meta: {
+      title: '查看知识库',
+      hideInMenu: true,
+      notCache: true
+    },
+    component: () => import('@/view/mst/knowledge/view.vue')
+  },
+  {
+    path: '/agreement-index',
+    name: 'agreement-index',
+    meta: {
+      title: '查看协议',
+      hideInMenu: true,
+      notCache: true
+    },
+    component: () => import('@/view/mst/agreement/index.vue')
+  },
+  {
     path: '/',
     name: '_home',
     component: Main,

+ 54 - 13
src/view/mst/activity/index.vue

@@ -41,6 +41,7 @@
           <DkTableColumn field="activityStatusName"/>
           <DkTableColumn field="beginDate" :dataType="$config.columnType.date"></DkTableColumn>
           <DkTableColumn field="endDate" :dataType="$config.columnType.date"></DkTableColumn>
+          <DkTableColumn field="gradeName"/>
           <DkTableColumn field="flgValid" type="switch"/>
           <DkTableColumn field="remarks"></DkTableColumn>
         </DkTable>
@@ -51,8 +52,9 @@
                  :height="this.tableHeight * (1-split)" primaryKey="itemId" name="table">
           <DkTableColumn field="activityItemName"></DkTableColumn>
           <DkTableColumn field="activityItemDescribe"></DkTableColumn>
-          <DkTableColumn field="stdPrice"  data-type="number" :digits="2"></DkTableColumn>
-          <DkTableColumn field="salePrice" data-type="number" :digits="2"></DkTableColumn>
+          <DkTableColumn field="stdPrice"  data-type="number" :digits="2" :title="$t('packagePrice')"></DkTableColumn>
+          <DkTableColumn field="webPrice" data-type="number" :digits="2"></DkTableColumn>
+          <DkTableColumn field="wxPrice" data-type="number" :digits="2"></DkTableColumn>
           <DkTableColumn field="validLong"></DkTableColumn>
           <DkTableColumn field="extraLong"></DkTableColumn>
         </DkTable>
@@ -107,8 +109,13 @@
         <DkFormItem prop="funId" :label="$t('activityFunId')" :required="true" v-if="funFlag">
           <SelectMagnifier v-model="formData.funId" :display-text="formData.funName"
                            :type="this.$config.MagnifierType.activityFunId"
-                           :multiple="false"
-                           @ok="funIdOk"/>
+                           :multiple="false"/>
+        </DkFormItem>
+        <!--活动功能包-->
+        <DkFormItem prop="funIds" :label="$t('activityFunId')" :required="true" v-if="funIdsFlag" :data-type="$config.dataType.array">
+          <SelectMagnifier v-model="formData.funIds" :display-text="formData.funName"
+                           :type="this.$config.MagnifierType.activityFunId"
+                           :multiple="true"/>
         </DkFormItem>
         <!--图片路径-->
         <DkFormItem prop="annexPaths" :label="$t('activityBanner')" v-if="bannerFlag">
@@ -155,7 +162,7 @@
              @modalCancel="cancelMeasure"
              :saveFlag="true">
       <DkCollapse ref="collapse">
-        <DkPanel prop="活动总单">
+        <DkPanel prop="activity">
           <DkForm slot="content" ref="formMeasure" style="width:100%;" name="dk-form" v-model="totalForm" :col-count="3">
             <!--活动名称-->
             <DkFormItem prop="activityName">
@@ -192,11 +199,14 @@
               <DkFormItem prop="activityItemDescribe"  :required="true">
                 <InputPop v-model="item.activityItemDescribe"/>
               </DkFormItem>
-              <DkFormItem prop="stdPrice"  :required="true" data-type="number">
+              <DkFormItem prop="stdPrice" :label="$t('packagePrice')" :required="true" data-type="number">
                 <InputNumberPop v-model="item.stdPrice"/>
               </DkFormItem>
-              <DkFormItem prop="salePrice"  :required="true" data-type="number">
-                <InputNumberPop v-model="item.salePrice"/>
+              <DkFormItem prop="webPrice"  :required="true" data-type="number" v-if="totalForm.gradeCode == 'PRO' || (totalForm.activityType != '活动分类-功能' && totalForm.activityType != '活动分类-功能包')">
+                <InputNumberPop v-model="item.webPrice"/>
+              </DkFormItem>
+              <DkFormItem prop="wxPrice"  :required="true" data-type="number" v-if="totalForm.gradeCode == 'PRO' || (totalForm.activityType != '活动分类-功能' && totalForm.activityType != '活动分类-功能包')">
+                <InputNumberPop v-model="item.wxPrice"/>
               </DkFormItem>
               <DkFormItem prop="validLong"  :required="true" data-type="number">
                 <InputNumberPop v-model="item.validLong" :unit="'月'"/>
@@ -232,6 +242,7 @@ export default {
       gradeFlag:false,//活动版本显示标识
       funFlag:false,//活动功能显示标识
       bannerFlag:false,//活动广告显示标识
+      funIdsFlag:false,//功能包多选标识
       itemModal:false,
       tableData: [],
       tableDataDetail_activityItem: [],
@@ -254,6 +265,7 @@ export default {
         funName:null,
         appCode:null,
         cpIds:null,
+        funIds:null,
       },
       //总单
       totalForm:{
@@ -281,7 +293,8 @@ export default {
           activityItemName:null,
           activityItemDescribe:null,
           stdPrice:null,
-          salePrice:null,
+          webPrice:null,
+          wxPrice:null,
           validLong:null,
           extraLong:null,
         }]
@@ -303,7 +316,7 @@ export default {
     * @date   : 2024/4/16 8:57
     */
     addNewItem() {
-      this.itemForm.itemList.push({"itemId":null,"activityItemName": null,"activityItemDescribe": null, "stdPrice": null, "salePrice": null,"validLong":null,"extraLong":null})
+      this.itemForm.itemList.push({"itemId":null,"activityItemName": null,"activityItemDescribe": null, "stdPrice": null, "webPrice": null,"wxPrice":null,"validLong":null,"extraLong":null})
     },
     /**
     * @desc   : 取消
@@ -318,7 +331,8 @@ export default {
         activityItemName:null,
         activityItemDescribe:null,
         stdPrice:null,
-        salePrice:null,
+        webPrice:null,
+        wxPrice:null,
         validLong:null,
         extraLong:null,
       }]
@@ -342,6 +356,7 @@ export default {
           this.loading = false
           if (res.code === 200) {
             this.$Message.success(res.message)
+            this.searchData()
             //关闭
             this.cancelMeasure()
           } else {
@@ -367,7 +382,7 @@ export default {
         this.totalForm.activityId = this.$refs['table-select'].batchRows[0].activityId
         this.getActivity(this.totalForm.activityId)
       } else {
-        this.$Message.error(this.$t('W_040'))
+        this.$Message.error(this.$t('W_013'))
       }
     },
 
@@ -391,7 +406,7 @@ export default {
         this.getActivity(this.totalForm.activityId)
         this.getActivityItem(this.totalForm.activityId)
       } else {
-        this.$Message.error(this.$t('W_040'))
+        this.$Message.error(this.$t('W_013'))
       }
     },
 
@@ -470,22 +485,32 @@ export default {
         if(row.kindCode === '活动分类-版本'){
           this.gradeFlag = true
           this.funFlag = false
+          this.funIdsFlag = false
           this.bannerFlag = false
         }
         if(row.kindCode === '活动分类-功能'){
           this.gradeFlag = false
           this.funFlag = true
+          this.funIdsFlag = false
+          this.bannerFlag = false
+        }
+        if(row.kindCode === '活动分类-功能包'){
+          this.gradeFlag = false
+          this.funFlag = false
+          this.funIdsFlag = true
           this.bannerFlag = false
         }
         if(row.kindCode === '活动分类-广告'){
           this.gradeFlag = false
           this.funFlag = false
+          this.funIdsFlag = false
           this.bannerFlag = true
           this.formData.flgBanner = true
         }
         if(row.kindCode === '活动分类-充值'){
           this.gradeFlag = false
           this.funFlag = false
+          this.funIdsFlag = false
           this.bannerFlag = false
         }
       }
@@ -591,7 +616,12 @@ export default {
       if(params.endDate){
         params.endDate = params.endDate.format('yyyy-MM-dd')
       }
+      params.activityStatus = '活动状态-未发布'
+      if(params.activityType === '活动分类-功能包'){
+        params.gradeCode = 'STD'
+      }
       console.log('this.params', this.params)
+      this.loading = false
       if (this.modalParams.button === this.$config.formMode.add) {
         delete this.params.activityId // 解决提示主键重复的问题,删除主键代码
         return this.excute(this.$service.activityService, this.$service.activityService.insert, params)
@@ -629,6 +659,7 @@ export default {
       this.gradeFlag = false//活动版本显示标识
       this.funFlag = false//活动功能显示标识
       this.bannerFlag= false//活动广告显示标识
+      this.funIdsFlag = false//功能包显示标识
     },
     /**
      * @desc   : 通过id查询
@@ -642,22 +673,32 @@ export default {
             if(activityType === '活动分类-版本'){
               this.gradeFlag = true
               this.funFlag = false
+              this.funIdsFlag = false
               this.bannerFlag = false
             }
             if(activityType === '活动分类-功能'){
               this.gradeFlag = false
               this.funFlag = true
+              this.funIdsFlag = false
+              this.bannerFlag = false
+            }
+            if(activityType === '活动分类-功能包'){
+              this.gradeFlag = false
+              this.funFlag = false
+              this.funIdsFlag = true
               this.bannerFlag = false
             }
             if(activityType === '活动分类-广告'){
               this.gradeFlag = false
               this.funFlag = false
+              this.funIdsFlag = false
               this.bannerFlag = true
               this.formData.flgBanner = true
             }
             if(activityType === '活动分类-充值'){
               this.gradeFlag = false
               this.funFlag = false
+              this.funIdsFlag = false
               this.bannerFlag = false
             }
             this.formData = res.data

+ 51 - 0
src/view/mst/agreement/index.vue

@@ -0,0 +1,51 @@
+<!-- @desc:协议查看  @auth:常皓宁  @time:2024-07-17 14:53 -->
+<template>
+  <div class="main-div" style="height: 100%">
+    <div class="notice-page">
+      <!--协议内容-->
+      <div v-html="agcontent" class="ql-editor" style="padding: 0 20%"/>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import {indexMixin} from '@/mixins'
+import "quill/dist/quill.core.css"
+
+export default {
+  name: 'knowledge-view',
+  mixins: [indexMixin],
+  data() {
+    return {
+      agcontent: {},
+    }
+  },
+  methods: {
+  },
+  mounted() {
+    console.log('this.$route.query', this.$route.query)
+    this.loading = true
+    this.excuteNoParam(this.$service.agreementService, this.$service.agreementService.selectById, [this.$route.query.agId],false).then(res => {
+      // 通过id查询
+      if (res.code === 200) {
+        this.agcontent = res.data.agContent
+        this.loading = false
+      } else {
+        this.$Message.error(res.message)
+        this.loading = false
+      }
+    })
+  }
+}
+</script>
+
+<style scoped>
+.notice-page {
+  background: white;
+  padding-top: 40px;
+  height: 100%;
+  overflow: auto;
+}
+
+</style>

+ 106 - 0
src/view/mst/company-trade/index.vue

@@ -0,0 +1,106 @@
+<!-- @desc:交易记录  @auth:常皓宁  @time:2024-06-25 13:47 -->
+<template>
+  <div class="main-div" ref="mainDiv">
+    <loading :loading="loading" v-if="!modalVisible"></loading>
+    <BaseIndexButtonGroup ref="BaseIndexButtonGroup" id="BaseIndexButtonGroup">
+      <template #left>
+        <BaseIndexButton ref="search" name="search"></BaseIndexButton>
+        <BaseIndexButton ref="clear" name="clear"></BaseIndexButton>
+      </template>
+    </BaseIndexButtonGroup>
+
+    <!--  查询条件区域  -->
+    <div id="search-cond-div" ref="search-cond-div" class="search-cond-class">
+      <SearchCond ref="searchCond" v-model="searchCond"
+                  @collapse-change="collapseChange" :setFlag="false"
+                  :searchContent="searchContent"
+      ></SearchCond>
+    </div>
+    <!--  表格部分  -->
+      <div slot="top" style="margin-left: 5px;">
+        <DkTable ref="table-select" name="table" :data="tableData" primaryKey="tradeId"
+                 @pageChange="pageSizeChange"
+                 :page-total="pageInfo.total"
+                 :page-size="pageInfo.pageSize"
+                 :page-size-opts="pageSizeOpts"
+                 :current-page="pageInfo.currentPage"
+                 :choose-flag="false"
+                 :height="this.tableHeight" showFooter>
+          <DkTableColumn field="tradeNo"></DkTableColumn>
+          <DkTableColumn field="cpName"></DkTableColumn>
+          <DkTableColumn field="tradeAmount" :data-type="$config.dataType.number"></DkTableColumn>
+          <DkTableColumn field="tradeTime"></DkTableColumn>
+          <DkTableColumn field="tradeTypeName" :title="$t('tradeType')"></DkTableColumn>
+          <DkTableColumn field="buyLong"></DkTableColumn>
+          <DkTableColumn field="buyBeginDate"></DkTableColumn>
+          <DkTableColumn field="buyEndDate"></DkTableColumn>
+          <DkTableColumn field="gradeName" :title="$t('buyGradeCode')"></DkTableColumn>
+          <DkTableColumn field="wxTradeNo"></DkTableColumn>
+          <DkTableColumn field="extendDays"></DkTableColumn>
+          <DkTableColumn field="dkUserId"></DkTableColumn>
+          <DkTableColumn field="tradeStatusName" :title="$t('tradeStatus')"></DkTableColumn>
+        </DkTable>
+      </div>
+
+  </div>
+</template>
+
+<script>
+import {indexMixin} from '@/mixins'
+
+export default {
+  name: "company-trade",
+  mixins: [indexMixin],
+  data() {
+    let self = this
+    return {
+      formData:{
+        cpId:null,
+        cpName:null,
+        svcCode:null,
+        svcIp:null,
+        svcPort:null,
+        staffId: null,
+        staffCode:null,
+        staffName: null,
+        userPhone:null,
+      },
+      searchContent: [
+        {
+          itemCode: '交易单号-文本',
+          itemName: 'tradeNo',
+          valueFormat: {code: 'tradeNo'},
+          valueKind: 'STR'
+        },
+        {
+          itemCode: 'cpIds',
+          itemName: self.$t('cpName'),
+          valueFormat: {code: 'cpIds'},
+          valueKind: 'M-SEARCH',
+          magnifierType: self.$config.MagnifierType.company
+        },
+      ],
+    }
+  },
+  methods: {
+
+    /**
+     * @desc   : 查询数据
+     * @author : 常皓宁
+     * @date   : 2024/4/15 13:34
+     */
+    getData(params) {
+      this.tableData = null;
+      return this.excute(this.$service.cpTradeService, this.$service.cpTradeService.selectByCond, params)
+    },
+  },
+  created() {
+    this.primaryKey = 'tradeId'  // 设置主键Id
+    this.routeObjName = 'cpTrade'  // 设置路由名称
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 21 - 1
src/view/mst/company/form.vue

@@ -5,7 +5,7 @@
     <DkCollapse @on-change="changeCollapse" ref="collapse">
       <DkPanel prop="essentialInformation">
         <!--  下拉区域  -->
-        <DkForm slot="content" ref="formInline" v-model="formData"  :labelMaxWords=5>
+        <DkForm slot="content" ref="formInline" v-model="formData"  :labelMaxWords=6>
           <!--活动版本-->
           <DkFormItem prop="gradeCode" :required="true">
             <SelectPop v-model="formData.gradeCode" ref="gradeCode"
@@ -27,6 +27,20 @@
           <DkFormItem :required="true" prop="cpPhone">
             <InputPop ref="cpPhone" v-model="formData.cpPhone" :readonly="type == $config.formMode.edit" :telephone="true"/>
           </DkFormItem>
+          <!--Web授权数-->
+          <DkFormItem :required="true" prop="webMaxNum" v-if="formData.gradeCode == 'PRO'">
+            <InputPop ref="webMaxNum" v-model="formData.webMaxNum" :readonly="type == $config.formMode.edit"/>
+          </DkFormItem>
+          <!--小程序授权数-->
+          <DkFormItem :required="true" prop="wxMaxNum" v-if="formData.gradeCode == 'PRO'">
+            <InputPop ref="wxMaxNum" v-model="formData.wxMaxNum" :readonly="type == $config.formMode.edit"/>
+          </DkFormItem>
+          <!--结束日期-->
+          <DkFormItem prop="endDate" :required="true" :data-type="$config.dataType.date">
+            <DatePickerPop v-model="formData.endDate"
+                           :placeholder="$t('inputWords',{'search-name':$t('endDate')})"
+                           type="date" :short-cut-flag="true"/>
+          </DkFormItem>
           <!--公司规模-->
           <DkFormItem prop="cpSize">
             <InputNumberPop ref="cpSize" v-model="formData.cpSize"/>
@@ -68,6 +82,9 @@ export default {
         cpSize:null,
         shopSize:null,
         feedback:null,
+        webMaxNum:0,
+        wxMaxNum:1,
+        endDate:null,
       },
     }
   },
@@ -91,6 +108,9 @@ export default {
 
     setParams() {
       this.params = {...this.formData}
+      if (this.formData.endDate) {
+        this.params.endDate = this.formData.endDate.format('yyyy-MM-dd')
+      }
     },
 
     /**

+ 133 - 6
src/view/mst/company/index.vue

@@ -8,6 +8,7 @@
         <BaseIndexButton ref="clear" name="clear"></BaseIndexButton>
         <BaseIndexButton ref="edit" name="edit"></BaseIndexButton>
         <BaseIndexButton ref="operation" name="operation"></BaseIndexButton>
+        <BaseIndexButton ref="upOwner" name="upOwner"></BaseIndexButton>
       </template>
       <template #right>
         <BaseIndexButton ref="add" name="add"></BaseIndexButton>
@@ -37,10 +38,13 @@
           <DkTableColumn field="cpCode"></DkTableColumn>
           <DkTableColumn field="cpName"></DkTableColumn>
           <DkTableColumn field="svcCode"></DkTableColumn>
-          <DkTableColumn field="openingDate"></DkTableColumn>
+          <DkTableColumn field="svcIp"></DkTableColumn>
+          <DkTableColumn field="svcPort"></DkTableColumn>
           <DkTableColumn field="gradeCode"></DkTableColumn>
+          <DkTableColumn field="openingDate"></DkTableColumn>
           <DkTableColumn field="endDate"></DkTableColumn>
-          <DkTableColumn field="maxStaffNum"></DkTableColumn>
+          <DkTableColumn field="wxMaxNum"></DkTableColumn>
+          <DkTableColumn field="webMaxNum"></DkTableColumn>
           <DkTableColumn field="curStaffNum"></DkTableColumn>
           <DkTableColumn field="cpManager"></DkTableColumn>
           <DkTableColumn field="cpPhone"></DkTableColumn>
@@ -56,8 +60,8 @@
                  :height="this.tableHeight * (1-split)" primaryKey="menuUuid" name="table">
           <DkTableColumn field="menuName" :title="$t('funName')"></DkTableColumn>
           <DkTableColumn field="appPlace" ></DkTableColumn>
-          <DkTableColumn field="qty"></DkTableColumn>
-          <DkTableColumn field="updateTime"></DkTableColumn>
+          <DkTableColumn field="qty" :data-type="$config.dataType.number"></DkTableColumn>
+          <DkTableColumn field="opUpdateTime"></DkTableColumn>
         </DkTable>
       </div>
     </DkSplit>
@@ -71,7 +75,6 @@
       :title="modalTitle"
       :okVisibleFlag="false"
       :cancelVisibleFlag="false"
-      :closable="false"
       :width="600"
     >
       <DkForm ref="formInline" v-model="formData" :col-count="1" :labelMaxWords="6">
@@ -83,7 +86,12 @@
         <DkFormItem prop="staffId" :label="$t('staffId')" :required="true">
           <SelectMagnifier v-model="formData.staffId" :display-text="formData.staffName"
                            :type="this.$config.MagnifierType.outStaff"
-                           :other-condition="{svcCode: this.formData.svcCode,cpId:this.formData.cpId}"
+                           :other-condition="{
+                             svcCode: this.formData.svcCode,
+                             cpId:this.formData.cpId,
+                             svcPort:this.formData.svcPort,
+                             svcIp:this.formData.svcIp,
+                           }"
                            :multiple="false"
                            @ok="staffOk"/>
         </DkFormItem>
@@ -96,6 +104,36 @@
       <DkButton slot="footer" @click="NoBindStaff">{{'解绑'}}</DkButton>
     </DkModal>
 
+    <!--责任人转让-->
+    <DkModal
+      v-model="upOwnerModal"
+      ref="upload_modal"
+      @on-visible-change="handleVisibleModal"
+      @modalOk="upOwnerOk"
+      :title="upOwnerModalTitle"
+      :width="600"
+    >
+      <DkForm ref="formInline" v-model="ownerData" :col-count="1" :labelMaxWords="6">
+        <!--公司-->
+        <DkFormItem prop="cpName">
+          <input-pop v-model="ownerData.cpName" :disabled="true"/>
+        </DkFormItem>
+        <!--业务员-->
+        <DkFormItem prop="staffId" :label="$t('staffId')" :required="true">
+          <SelectMagnifier v-model="formData.staffId" :display-text="formData.staffName"
+                           :type="this.$config.MagnifierType.outStaff"
+                           :other-condition="{
+                             svcCode: this.ownerData.svcCode,
+                             cpId:this.ownerData.cpId,
+                             svcPort:this.ownerData.svcPort,
+                             svcIp:this.ownerData.svcIp,
+                           }"
+                           :multiple="false"
+                           @ok="ownerOk"/>
+        </DkFormItem>
+      </DkForm>
+    </DkModal>
+
   </div>
 </template>
 
@@ -109,17 +147,31 @@ export default {
     let self = this
     return {
       bindModal:false,//窗口
+      upOwnerModal:false,//窗口
       modalTitle:'运维服务',
+      upOwnerModalTitle:'责任人转让',
       menuFrequencyData:[],
       formData:{
         cpId:null,
         cpName:null,
         svcCode:null,
+        svcIp:null,
+        svcPort:null,
         staffId: null,
         staffCode:null,
         staffName: null,
         userPhone:null,
       },
+      ownerData:{
+        cpId:null,
+        cpName:null,
+        svcCode:null,
+        svcIp:null,
+        svcPort:null,
+        staffId: null,
+        staffCode:null,
+        staffName: null,
+      },
       searchContent: [
         {
           itemCode: '企业名称-文本',
@@ -127,6 +179,28 @@ export default {
           valueFormat: {code: 'cpName'},
           valueKind: 'STR'
         },
+        {
+          itemCode: '联系电话-文本',
+          itemName: 'cpPhone',
+          valueFormat: {code: 'cpPhone'},
+          valueKind: 'STR'
+        },
+        {
+          itemCode: '注册日期-时间',
+          itemName: 'openingDate',
+          valueFormat: {
+            code: 'openingDate',
+          },
+          valueKind: 'DATE_RANGE'
+        },
+        {
+          itemCode: '截止日期-时间',
+          itemName: 'endDate',
+          valueFormat: {
+            code: 'endDate',
+          },
+          valueKind: 'DATE_RANGE'
+        },
       ],
     }
   },
@@ -172,6 +246,25 @@ export default {
       this.formData.svcCode = rows[0]['svcCode']
       this.formData.cpName = rows[0]['cpName']
       this.formData.cpId = rows[0]['cpId']
+      this.formData.svcIp = rows[0]['svcIp']
+      this.formData.svcPort = rows[0]['svcPort']
+    },
+
+    /**
+    * @desc   : 责任人转让
+    * @author : 常皓宁
+    * @date   : 2024/6/24 11:23
+    */
+    upOwner({rows}){
+      if (!rows) {
+        rows = [this.$refs['table-select'].getCurrentRow()]
+      }
+      this.upOwnerModal = true
+      this.ownerData.svcCode = rows[0]['svcCode']
+      this.ownerData.cpName = rows[0]['cpName']
+      this.ownerData.cpId = rows[0]['cpId']
+      this.ownerData.svcIp = rows[0]['svcIp']
+      this.ownerData.svcPort = rows[0]['svcPort']
     },
 
     /**
@@ -185,6 +278,18 @@ export default {
     },
 
     /**
+     * @desc   : 选择责任人
+     * @author : 常皓宁
+     * @date   : 2024/6/19 16:48
+     */
+    ownerOk(val){
+      this.ownerData.staffCode = val[0]['staffCode']
+      this.ownerData.staffName = val[0]['staffName']
+      this.ownerData.staffId = val[0]['staffId']
+      this.ownerData.staffPhone = val[0]['staffPhone']
+    },
+
+    /**
     * @desc   : 绑定
     * @author : 常皓宁
     * @date   : 2024/6/19 16:30
@@ -234,6 +339,28 @@ export default {
       })
     },
 
+    /**
+    * @desc   : 责任人转让
+    * @author : 常皓宁
+    * @date   : 2024/6/24 17:01
+    */
+    upOwnerOk() {
+        let params = this.ownerData
+        this.loading = true;
+        this.excute(this.$service.companyService, this.$service.companyService.upOwner,
+          params, true).then(res=>{
+          if(res.code === this.$config.SUCCESS_CODE){
+            this.$Message.success(res.message)
+            // 关闭窗体
+            this.upOwnerModal = false;
+            this.searchData()
+          }else{
+            this.$Message.warning(res.message)
+          }
+          this.loading = false;
+        })
+    },
+
   },
   created() {
     this.primaryKey = 'cpId'  // 设置主键Id

+ 0 - 1
src/view/mst/goods-attr/index.vue

@@ -365,7 +365,6 @@ export default {
       this.modalTitle = this.setTitle(this.$config.formMode.add, '商品属性')
       let row = this.$refs['leftTable'].$refs.table.getCurrentRecord()
       if (row) {
-        this.formData = {}
         this.formData.kindName = row.kindName
         this.kindName = row.kindName
       }

+ 18 - 0
src/view/mst/knowledge/add.vue

@@ -0,0 +1,18 @@
+<template>
+  <CommonForm type="add"></CommonForm>
+</template>
+
+<script>
+import CommonForm from "./form";
+
+export default {
+  name: 'knowledge-add',
+  components: {
+    CommonForm
+  },
+}
+</script>
+
+<style scoped>
+
+</style>

+ 18 - 0
src/view/mst/knowledge/edit.vue

@@ -0,0 +1,18 @@
+<template>
+  <CommonForm type="edit"></CommonForm>
+</template>
+
+<script>
+import CommonForm from "./form";
+
+export default {
+  name: 'knowledge-edit',
+  components: {
+    CommonForm
+  },
+}
+</script>
+
+<style scoped>
+
+</style>

+ 163 - 0
src/view/mst/knowledge/form.vue

@@ -0,0 +1,163 @@
+<template>
+  <div class="main-div" ref="mainDiv">
+    <!--加载中-->
+    <loading :loading="loading" v-if="!modalVisible"></loading>
+    <DkCollapse @on-change="changeCollapse" ref="collapse">
+      <DkPanel prop="essentialInformation">
+        <!--  下拉区域  -->
+        <DkForm slot="content" ref="formInline" v-model="formData" :labelMaxWords=6>
+          <!--知识库名称-->
+          <DkFormItem prop="kgName" :required="true">
+            <InputPop v-model="formData.kgName"/>
+          </DkFormItem>
+          <!--系统版本编码-->
+          <DkFormItem prop="gradeCode">
+            <SelectPop v-model="formData.gradeCode" ref="gradeCode"
+                       :options="gradeList"
+                       :multiple="false"
+                       labelKey="gradeName" valueKey="gradeCode">
+            </SelectPop>
+          </DkFormItem>
+          <!--应用类型-->
+          <DkFormItem prop="appCode">
+            <SelectPop v-model="formData.appCode" ref="appCode"
+                       :options="appCodeList"
+                       :multiple="false"
+                       labelKey="appName" valueKey="appCode">
+            </SelectPop>
+          </DkFormItem>
+          <!--活动功能-->
+          <DkFormItem prop="funId">
+            <SelectMagnifier v-model="formData.funId" :display-text="formData.funName"
+                             :type="this.$config.MagnifierType.activityFunId"
+                             :multiple="false"/>
+          </DkFormItem>
+          <!--知识库链接-->
+          <DkFormItem prop="kgContent" :required="true" :span="24">
+            <!--富文本编译器-->
+            <QuillEditor :index="0" :value="formData.kgContent" @value-change="change"
+                         prefix="t_mst_knowledge/kg_content"/>
+          </DkFormItem>
+
+        </DkForm>
+      </DkPanel>
+    </DkCollapse>
+
+    <!--      下部分按钮区域-->
+    <DkSaveButton ref="saveButton" :loading="loading" @save="save" @close="close"></DkSaveButton>
+  </div>
+</template>
+
+<script>
+import {formMixin} from "@/mixins/form"
+import QuillEditor from "@/components/sub/QuillEditor"
+
+export default {
+  components: {
+    QuillEditor
+  },
+  mixins: [formMixin],
+
+  data() {
+    return {
+      gradeList: [],
+      appCodeList: [
+        {appCode: 'CP-WEB', appName: '智云PC端'},
+        {appCode: 'CP-WXP', appName: '智云移动端'},
+        {appCode: 'DK-WEB', appName: '智云运营端'}
+      ],//应用类型
+      formData: {
+        kgName: null,
+        kgContent: null,
+        gradeCode: null,
+        appCode: null,
+        funId:null,
+      },
+    }
+  },
+  methods: {
+
+    /**
+     *   @desc   : 获取富文本编译器中数据
+     *   @date   : 2022/5/17 16:12
+     *   @author : 寇珊珊
+     */
+    change({value}) {
+      this.formData.kgContent = value
+    },
+
+    /**
+     * @desc   : 编辑
+     * @author : 常皓宁
+     * @date   : 2024/5/6 14:00
+     */
+    detail(id) {
+      return this.excuteNoParam(this.$service.knowledgeService, this.$service.knowledgeService.selectById, [id], false)
+    },
+
+    /**
+    * @desc   : 编辑页面赋值
+    * @author : 常皓宁
+    * @date   : 2024/7/17 10:27
+    */
+    setValuesByEdit(data) {
+      if (data) {
+        this.formData = data
+      }
+    },
+
+    /**
+     * @desc   : 赋值
+     * @author : 常皓宁
+     * @date   : 2024/7/17 9:15
+     */
+    setParams() {
+      this.params = {...this.formData}
+    },
+
+    /**
+     * @desc   : 保存方法
+     * @author : 常皓宁
+     * @date   : 2024/4/30 14:17
+     */
+    saveData() {
+      //新建
+      console.log('this.params', this.params)
+      if (this.type === this.$config.formMode.add) {
+        return this.excute(this.$service.knowledgeService, this.$service.knowledgeService.insert, this.params)
+      } else {
+        return this.excute(this.$service.knowledgeService, this.$service.knowledgeService.update, this.params)
+      }
+    },
+
+    /**
+     * @desc   : 获取版本代码
+     * @author : 常皓宁
+     * @date   : 2024/4/15 10:47
+     */
+    getGrade() {
+      // 查询数据
+      let params = {}
+      this.excute(this.$service.commonService, this.$service.commonService.getGrade, params).then(res => {
+        if (res.code === this.$config.SUCCESS_CODE) {
+          this.gradeList = res.data
+        }
+      })
+    },
+
+    /**
+     * @desc   : 加载数据
+     * @author : 付斌
+     * @date   : 2024/3/1 11:16
+     */
+    initData() {
+      this.getGrade()
+    },
+
+  },
+}
+</script>
+
+<style scoped>
+
+</style>

+ 84 - 0
src/view/mst/knowledge/index.vue

@@ -0,0 +1,84 @@
+<!-- @desc:知识库  @auth:常皓宁  @time:2024-6-27 14:28 -->
+<template>
+  <div class="main-div" ref="mainDiv">
+    <loading :loading="loading" v-if="!modalVisible"></loading>
+    <BaseIndexButtonGroup ref="BaseIndexButtonGroup" id="BaseIndexButtonGroup">
+      <template #left>
+        <BaseIndexButton ref="search" name="search"></BaseIndexButton>
+        <BaseIndexButton ref="clear" name="clear"></BaseIndexButton>
+        <BaseIndexButton ref="edit" name="edit"></BaseIndexButton>
+      </template>
+      <template #right>
+        <BaseIndexButton ref="add" name="add"></BaseIndexButton>
+      </template>
+    </BaseIndexButtonGroup>
+
+    <!--  查询条件区域  -->
+    <div id="search-cond-div" ref="search-cond-div" class="search-cond-class">
+      <SearchCond ref="searchCond" v-model="searchCond"
+                  @collapse-change="collapseChange" :setFlag="false"
+                  :searchContent="searchContent"
+      ></SearchCond>
+    </div>
+    <!--  表格部分  -->
+    <div slot="top" style="margin-left: 5px;">
+      <DkTable ref="table-select" name="table" :data="tableData" primaryKey="kgId"
+               @pageChange="pageSizeChange"
+               :page-total="pageInfo.total"
+               :page-size="pageInfo.pageSize"
+               :page-size-opts="pageSizeOpts"
+               :current-page="pageInfo.currentPage"
+               :choose-flag="false"
+               :height="this.tableHeight" showFooter>
+        <DkTableColumn field="kgName"></DkTableColumn>
+        <DkTableColumn field="kgContent"></DkTableColumn>
+        <DkTableColumn field="gradeCode"></DkTableColumn>
+        <DkTableColumn field="appCode"></DkTableColumn>
+      </DkTable>
+    </div>
+
+  </div>
+</template>
+
+<script>
+import {indexMixin} from '@/mixins'
+
+export default {
+  name: "knowledge",
+  mixins: [indexMixin],
+  data() {
+    let self = this
+    return {
+      modalTitle: '',
+      gradeList:[],//版本代码
+      appCodeList: [
+        {appCode:'CP-WEB',appName:'智云PC端'},
+        {appCode:'CP-WXP',appName:'智云移动端'},
+        {appCode:'DK-WEB',appName:'智云运营端'}
+      ],//应用类型
+      searchContent: [
+
+      ],
+    }
+  },
+  methods: {
+    /**
+     * @desc   : 查询数据
+     * @author : 常皓宁
+     * @date   : 2024/4/15 13:34
+     */
+    getData(params) {
+      return this.excute(this.$service.knowledgeService, this.$service.knowledgeService.selectByCond, params)
+    },
+
+  },
+  created() {
+    this.primaryKey = 'kgId'  // 设置主键Id
+    this.routeObjName = 'knowledge'  // 设置路由名称
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 64 - 0
src/view/mst/knowledge/view.vue

@@ -0,0 +1,64 @@
+<!-- @desc:知识库查看  @auth:常皓宁  @time:2024-07-17 14:53 -->
+<template>
+  <div class="main-div" style="height: 100%">
+    <div class="notice-page">
+      <!--知识库内容-->
+      <div v-html="kgContent" class="ql-editor" style="padding: 0 20%"/>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import {indexMixin} from '@/mixins'
+
+export default {
+  name: 'knowledge-view',
+  mixins: [indexMixin],
+  data() {
+    return {
+      kgContent: {},
+    }
+  },
+  methods: {
+  },
+  mounted() {
+    // const vConsole = new VConsole();
+    console.log('this.$route.query', this.$route.query)
+    if (!this.$route.query.appCode) {
+      this.$Message.warning('应用类型未填写')
+      return
+    }
+    if (!this.$route.query.funId) {
+      this.$Message.warning('功能ID未填写')
+      return
+    }
+    this.loading = true
+    let params = {
+      gradeCode:this.$route.query.gradeCode,
+      appCode:this.$route.query.appCode,
+      funId:this.$route.query.funId,
+    }
+    this.excute(this.$service.knowledgeService, this.$service.knowledgeService.selectByCond, params).then(res => {
+      // 通过id查询
+      if (res.code === 200) {
+        this.kgContent = res.data.list[0].kgContent
+        this.loading = false
+      } else {
+        this.$Message.error(res.message)
+        this.loading = false
+      }
+    })
+  }
+}
+</script>
+
+<style scoped>
+.notice-page {
+  background: white;
+  padding-top: 40px;
+  height: 100%;
+  overflow: auto;
+}
+
+</style>