浏览代码

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	vue.config.js
000766 2 年之前
父节点
当前提交
982efa749e
共有 77 个文件被更改,包括 8986 次插入2648 次删除
  1. 2 2
      .env.development
  2. 2 2
      .env.production
  3. 2 2
      .env.staging
  4. 1 1
      package.json
  5. 二进制
      public/favicon_bak.ico
  6. 1 1
      public/index.html
  7. 25 8
      src/api/business/spd/bo/basic.js
  8. 18 0
      src/api/business/spd/bo/behaviorA.js
  9. 44 0
      src/api/business/spd/bo/education.js
  10. 9 0
      src/api/business/spd/bo/iuapquery/basic.js
  11. 44 0
      src/api/business/spd/bo/relationship.js
  12. 2 2
      src/api/changeApply/basic.js
  13. 133 4
      src/api/material/basic.js
  14. 58 0
      src/api/material/label.js
  15. 74 0
      src/api/requisition/basic.js
  16. 26 0
      src/api/system/table-template.js
  17. 3 2
      src/api/system/user.js
  18. 二进制
      src/assets/images/homePage.png
  19. 145 0
      src/components/PopDialog/dose.vue
  20. 236 0
      src/components/PopDialog/dose_bak.vue
  21. 133 0
      src/components/PopDialog/drug.vue
  22. 145 0
      src/components/PopDialog/fourClass.vue
  23. 26 47
      src/components/PopDialog/index.vue
  24. 236 0
      src/components/PopDialog/midPack.vue
  25. 134 0
      src/components/PopDialog/organization.vue
  26. 236 0
      src/components/PopDialog/place.vue
  27. 28 51
      src/components/PopDialog/productFactory.vue
  28. 236 0
      src/components/PopDialog/serviceline.vue
  29. 236 0
      src/components/PopDialog/staff.vue
  30. 236 0
      src/components/PopDialog/tax.vue
  31. 237 0
      src/components/PopDialog/unit.vue
  32. 4 4
      src/layout/components/Navbar.vue
  33. 1 1
      src/layout/components/Sidebar/Logo.vue
  34. 3 1
      src/router/index.js
  35. 4 3
      src/store/getters.js
  36. 3 1
      src/store/index.js
  37. 13 2
      src/store/material/query.js
  38. 27 2
      src/store/modules/user.js
  39. 155 113
      src/utils/request.js
  40. 591 182
      src/views/business/spd/bo/basic/details.vue
  41. 189 100
      src/views/business/spd/bo/basic/index.vue
  42. 440 39
      src/views/business/spd/bo/behavior/behaviorList.vue
  43. 338 173
      src/views/business/spd/bo/contact/contactList.vue
  44. 22 252
      src/views/business/spd/bo/contact/index.vue
  45. 301 0
      src/views/business/spd/bo/education/educationList.vue
  46. 61 18
      src/views/business/spd/bo/pojpsn/pojpsnList.vue
  47. 248 0
      src/views/business/spd/bo/refer/contact/index.vue
  48. 4 3
      src/views/business/spd/bo/refer/customer/index.vue
  49. 242 0
      src/views/business/spd/bo/refer/saleaea/index.vue
  50. 305 0
      src/views/business/spd/bo/relationship/relationshipList.vue
  51. 3 42
      src/views/business/spd/bo/task/index.vue
  52. 168 47
      src/views/business/spd/bo/task/taskList.vue
  53. 1 1
      src/views/index.vue
  54. 2 2
      src/views/login.vue
  55. 338 151
      src/views/material/basicFile/details.vue
  56. 78 29
      src/views/material/basicFile/index.vue
  57. 210 58
      src/views/material/changeApply/add.vue
  58. 94 55
      src/views/material/changeApply/index.vue
  59. 220 124
      src/views/material/classify/index.vue
  60. 9 13
      src/views/material/label/index.vue
  61. 148 0
      src/views/material/label/label-add-dialog.vue
  62. 153 0
      src/views/material/label/label-edit-dialog.vue
  63. 310 0
      src/views/material/label/label-table.vue
  64. 0 0
      src/views/material/label/label-tree.vue
  65. 0 170
      src/views/material/label/lable-table.vue
  66. 448 187
      src/views/material/requisition/add.vue
  67. 71 52
      src/views/material/requisition/index.vue
  68. 1 1
      src/views/material/specialAttr/index.vue
  69. 1 1
      src/views/register.vue
  70. 307 0
      src/views/system/table-template/add-dialog.vue
  71. 94 0
      src/views/system/table-template/auth-dialog.vue
  72. 318 0
      src/views/system/table-template/edit-dialog.vue
  73. 20 499
      src/views/system/table-template/index.vue
  74. 298 0
      src/views/system/table-template/search-table.vue
  75. 0 171
      src/views/system/table-template/template-table.vue
  76. 2 2
      src/views/system/user/index.vue
  77. 33 27
      vue.config.js

+ 2 - 2
.env.development

@@ -1,10 +1,10 @@
 # 页面标题
-VUE_APP_TITLE = 德荣供应链管理平台
+VUE_APP_TITLE = 德荣资源平台
 
 # 开发环境配置
 ENV = 'development'
 
-# 德荣供应链管理平台/开发环境
+# 德荣资源平台/开发环境
 VUE_APP_BASE_API = '/drp-admin'
 #应用访问路径 例如使用前缀 /drp/
 VUE_APP_CONTEXT_PATH = '/drp'

+ 2 - 2
.env.production

@@ -1,10 +1,10 @@
 # 页面标题
-VUE_APP_TITLE = 德荣供应链管理平台
+VUE_APP_TITLE = 德荣资源平台
 
 # 生产环境配置
 ENV = 'production'
 
-# 德荣供应链管理平台/生产环境
+# 德荣资源平台/生产环境
 VUE_APP_BASE_API = '/drp-admin'
 #应用访问路径 例如使用前缀 /drp/
 VUE_APP_CONTEXT_PATH = '/drp'

+ 2 - 2
.env.staging

@@ -1,12 +1,12 @@
 # 页面标题
-VUE_APP_TITLE = 德荣供应链管理平台
+VUE_APP_TITLE = 德荣资源平台
 
 NODE_ENV = production
 
 # 测试环境配置
 ENV = 'staging'
 
-# 德荣供应链管理平台/测试环境
+# 德荣资源平台/测试环境
 VUE_APP_BASE_API = '/drp-admin'
 #应用访问路径 例如使用前缀 /drp/
 VUE_APP_CONTEXT_PATH = '/drp'

+ 1 - 1
package.json

@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.8.5",
-  "description": "德荣供应链管理平台",
+  "description": "德荣资源平台",
   "author": "德荣",
   "license": "MIT",
   "scripts": {

二进制
public/favicon_bak.ico


+ 1 - 1
public/index.html

@@ -7,7 +7,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <!-- <title><%= webpackConfig.name %></title> -->
-    <title>德荣供应链管理平台</title>
+    <title>德荣资源平台</title>
     <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
 	  <style>
     html,

+ 25 - 8
src/api/business/spd/bo/basic.js

@@ -41,6 +41,15 @@ export function updateBasic(data) {
   })
 }
 
+// 修改商机流程信息
+export function updateBasicFlow(data) {
+  return request({
+    url: '/mk/bo/flow',
+    method: 'put',
+    data: data
+  })
+}
+
 
 // 删除商机基础信息
 export function delBasic(id) {
@@ -50,14 +59,6 @@ export function delBasic(id) {
   })
 }
 
-//查询固定商机的行动列表
-export function getBehaviorList(id) {
-  return request({
-    url: '/mk/bo/basic/getBehaviorList/' + id,
-    method: 'get'
-  })
-}
-
 // 删除商机附件
 export function delAccessory(boId,f,id) {
   return request({
@@ -65,3 +66,19 @@ export function delAccessory(boId,f,id) {
     method: 'delete'
   })
 }
+
+//流程下一步
+export function nextFlow(boId,boStage) {
+  return request({
+    url: '/mk/bo/basic/flow?boId=' + boId + '&boStage=' + boStage,
+    method: 'put'
+  })
+}
+
+//提交
+export function submit(boId) {
+  return request({
+    url: '/mk/bo/basic/submit/' + boId,
+    method: 'get'
+  })
+}

+ 18 - 0
src/api/business/spd/bo/behaviorA.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 新增动作附件
+export function addBehaviorA(data) {
+  return request({
+    url: '/mk/bo/behaviorA',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除岗位
+export function delBehaviorA(behaviorAid) {
+  return request({
+    url: '/mk/bo/behaviorA/' + behaviorAid,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/business/spd/bo/education.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询联系人学历信息列表
+export function listEducation(query) {
+  return request({
+    url: '/mk/bo/education/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询联系人学历信息详细
+export function getEducation(id) {
+  return request({
+    url: '/mk/bo/education/' + id,
+    method: 'get'
+  })
+}
+
+// 新增联系人学历信息
+export function addEducation(data) {
+  return request({
+    url: '/mk/bo/education',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改联系人学历信息
+export function updateEducation(data) {
+  return request({
+    url: '/mk/bo/education',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除联系人学历信息
+export function delEducation(id) {
+  return request({
+    url: '/mk/bo/education/' + id,
+    method: 'delete'
+  })
+}

+ 9 - 0
src/api/business/spd/bo/iuapquery/basic.js

@@ -7,4 +7,13 @@ export function listCustomer(query) {
     method: 'get',
     params: query
   })
+}
+
+// 查询销售区域列表
+export function listSaleArea(query) {
+  return request({
+    url: '/mk/bo/iuapquery/saleAreaList',
+    method: 'get',
+    params: query
+  })
 }

+ 44 - 0
src/api/business/spd/bo/relationship.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询联系人社会关系列表
+export function listRelationship(query) {
+  return request({
+    url: '/mk/bo/relationship/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询联系人社会关系详细
+export function getRelationship(id) {
+  return request({
+    url: '/mk/bo/relationship/' + id,
+    method: 'get'
+  })
+}
+
+// 新增联系人社会关系
+export function addRelationship(data) {
+  return request({
+    url: '/mk/bo/relationship',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改联系人社会关系
+export function updateRelationship(data) {
+  return request({
+    url: '/mk/bo/relationship',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除联系人社会关系
+export function delRelationship(id) {
+  return request({
+    url: '/mk/bo/relationship/' + id,
+    method: 'delete'
+  })
+}

+ 2 - 2
src/api/changeApply/basic.js

@@ -42,7 +42,7 @@ export function getChangeDetails(id) {
 // 获取物料列表信息
 export function getMaterialList(data) {
   return request({
-    url: `/system/material/list`,
+    url: `/system/material/list?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
     method: 'post',
     data: data
   })
@@ -57,7 +57,7 @@ export function getMaterialDetails(id) {
 // 获取生产厂家列表信息
 export function getProductFactory(data) {
   return request({
-    url: `/system/archival/queryManufacturer`,
+    url: `/system/archival/queryManufacturer?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
     method: 'post',
     data: data
   })

+ 133 - 4
src/api/material/basic.js

@@ -145,7 +145,7 @@ const planList = (data) => {
 }
 
 // 查询计划信息详情 
-const planDetails = () => {
+const planDetails = (id) => {
   return request({
     url: `/system/plan/details/${id}`,
     method: 'get',
@@ -209,9 +209,9 @@ const inventoryDetails = (id) => {
 
 
 // 根据参数动态执行方法  -输入框点击弹窗出现数据查询
-const executeMethods = (methodName, data) => {
+const executeMethods = (methodName, data, page) => {
   return request({
-    url: `/system/archival/${methodName}`,
+    url: `/system/archival/${methodName}?pageSize=${page.pageSize}&pageNum=${page.pageNum}`,
     // url: `/system/archival/queryDosageForm`,
     method: 'post',
     data: data
@@ -268,6 +268,66 @@ const medcineitemBatchSave = (data) => {
   })
 }
 
+// 修改财务信息 /dev-api/drp-admin/system/finance/edit 
+const financeEdit = (data) => {
+  return request({
+    url: `/system/finance/edit `,
+    method: 'post',
+    data,
+  })
+}
+
+// 修改利润中心信息 /dev-api/drp-admin/system/center/edit
+const centerEdit = (data) => {
+  return request({
+    url: `/system/center/edit `,
+    method: 'post',
+    data,
+  })
+}
+
+// 修改采购信息 /dev-api/drp-admin/system/purchase/edit
+const purchaseEdit = (data) => {
+  return request({
+    url: `/system/purchase/edit `,
+    method: 'post',
+    data,
+  })
+}
+
+// 修改库存信息 /dev-api/drp-admin/system/inventory/edit
+const inventoryEdit = (data) => {
+  return request({
+    url: `/system/inventory/edit `,
+    method: 'post',
+    data,
+  })
+}
+
+// 修改计划信息 /dev-api/drp-admin/system/plan/edit
+const planEdit = (data) => {
+  return request({
+    url: `/system/plan/edit `,
+    method: 'post',
+    data,
+  })
+}
+
+// 修改成本信息 /dev-api/drp-admin/system/cost/edit
+const costEdit = (data) => {
+  return request({
+    url: `/system/cost/edit `,
+    method: 'post',
+    data,
+  })
+}
+
+
+
+/*
+*导入导出
+*/
+
 // 导入文件  /dev-api/drp-admin/system/material/import
 const fileImport = (data) => {
   return request({
@@ -277,11 +337,12 @@ const fileImport = (data) => {
   })
 }
 
+
 /**
  * 删除接口
  */
 // 删除物料基本信息-列表   /dev-api/drp-admin/system/material/delete/{id}
-const delMaterial = (data)=>{
+const delMaterial = (data) => {
   return request({
     url: '/system/material/delete',
     method: 'post',
@@ -289,6 +350,60 @@ const delMaterial = (data)=>{
   })
 }
 
+// 删除利润中心信息 /dev-api/drp-admin/system/center/delete/{id}
+const delCenter = (data) => {
+  return request({
+    url: `/system/center/delete`,
+    method: 'post',
+    data,
+  })
+}
+
+// 删除库存信息 /dev-api/drp-admin/system/inventory/delete/{id}
+const delInventory = (data) => {
+  return request({
+    url: `/system/inventory/delete`,
+    method: 'post',
+    data,
+  })
+}
+
+// 删除成本信息 /dev-api/drp-admin/system/cost/delete/{id}
+const delCost = (data) => {
+  return request({
+    url: `/system/cost/delete`,
+    method: 'post',
+    data,
+  })
+}
+
+// 删除计划信息 /dev-api/drp-admin/system/plan/delete/{id}
+const delPlan = (data) => {
+  return request({
+    url: `/system/plan/delete`,
+    method: 'post',
+    data,
+  })
+}
+
+// 删除财物信息 /dev-api/drp-admin/system/finance/delete/{id}
+const delFinance = (data) => {
+  return request({
+    url: `/system/finance/delete`,
+    method: 'post',
+    data,
+  })
+}
+
+// 删除采购信息 /dev-api/drp-admin/system/purchase/delete/{id}
+const delPurchase = (data) => {
+  return request({
+    url: `/system/purchase/delete`,
+    method: 'post',
+    data,
+  })
+}
+
 
 export default {
   // 查询
@@ -321,8 +436,22 @@ export default {
   saveMaterial,
   insertMaterialInfo,
   medcineitemBatchSave,
+  financeEdit,
+  centerEdit,
+  purchaseEdit,
+  inventoryEdit,
+  planEdit,
+  costEdit,
+
+  // 导入
   fileImport,
 
   // 删除
   delMaterial,
+  delCenter,
+  delInventory,
+  delCost,
+  delPlan,
+  delFinance,
+  delPurchase,
 }

+ 58 - 0
src/api/material/label.js

@@ -9,3 +9,61 @@ export function listTree(query) {
     params: query,
   });
 }
+
+// 查询用户列表
+export function list(data, params) {
+  return request({
+    url: "/system/label/labelList",
+    method: "post",
+    data: data,
+    params: params,
+  });
+}
+
+// 查询用户列表
+export function item(data, params) {
+  return request({
+    url: "/system/label/labelItem",
+    method: "post",
+    data: data,
+    params: params,
+  });
+}
+
+// 查询用户列表
+export function add(data, params) {
+  return request({
+    url: "/system/label/insertLabel",
+    method: "post",
+    data: data,
+    params: params,
+  });
+}
+
+// 查询用户列表
+export function edit(data) {
+  return request({
+    url: "/system/label/updateLabel",
+    method: "post",
+    data: data,
+  });
+}
+
+// 查询用户列表
+export function remove(params) {
+  return request({
+    url: "/system/label/deleteLabel",
+    method: "get",
+    params: params,
+  });
+}
+
+// 查询用户列表
+export function type(data, params) {
+  return request({
+    url: "/system/label/parentLabels",
+    method: "post",
+    data: data,
+    params: params,
+  });
+}

+ 74 - 0
src/api/requisition/basic.js

@@ -37,4 +37,78 @@ export function delReq(id) {
     url: `/system/apply/material/${id}`,
     method: 'delete',
   })
+}
+
+// 参照-计量单位
+export function getUnit(data) {
+  return request({
+    url: `/system/archival/queryUnit?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
+    method: 'post',
+    data: data
+  })
+}
+// 参照-产地
+export function getPlace(data) {
+  return request({
+    url: `/system/archival/queryOrigin?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
+    method: 'post',
+    data: data
+  })
+}
+// 参照-税类
+export function getTax(data) {
+  return request({
+    url: `/system/archival/queryTaxrate?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
+    method: 'post',
+    data: data
+  })
+}
+// 参照-采购员
+export function getStaff(data) {
+  return request({
+    url: `/system/archival/queryStaffInfo?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
+    method: 'post',
+    data: data
+  })
+}
+// 参照-业务线
+export function getLine(data) {
+  return request({
+    url: `/system/archival/queryServiceline?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
+    method: 'post',
+    data: data
+  })
+}
+// 参照-剂型-树形
+export function getDose(data) {
+  return request({
+    url: `/system/archival/queryDosageForm`,
+    method: 'post',
+    data: data
+  })
+}
+// 参照-采购组织-树形
+// 查询部门下拉树结构
+export function getOrgs(data) {
+  return request({
+    url: '/system/user/deptTree',
+    method: 'get',
+    params: data
+  })
+}
+// 参照-药品类别(子表)-树形
+export function getDrug(data) {
+  return request({
+    url: `/system/archival/queryMedcineItemDrug`,
+    method: 'post',
+    data: data
+  })
+}
+// 参照-中包装单位
+export function getMidPack(data) {
+  return request({
+    url: `/system/archival/queryMediumPackage?pageSize=${data.pageSize}&pageNum=${data.pageNo}`,
+    method: 'post',
+    data: data
+  })
 }

+ 26 - 0
src/api/system/table-template.js

@@ -21,6 +21,32 @@ export function item(id) {
 }
 
 // fetch table template item
+export function add(data) {
+  return request({
+    url: "/system/template/add",
+    method: "post",
+    data: data,
+  });
+}
+
+// fetch table template item
+export function edit(data) {
+  return request({
+    url: "/system/template/edit",
+    method: "post",
+    data: data,
+  });
+}
+
+// fetch table template item
+export function remove(id) {
+  return request({
+    url: "/system/template/delete/" + parseStrEmpty(id),
+    method: "get",
+  });
+}
+
+// fetch table template item
 export function role(id) {
   return request({
     url: "/system/template/template_role/detail/" + parseStrEmpty(id),

+ 3 - 2
src/api/system/user.js

@@ -127,9 +127,10 @@ export function updateAuthRole(data) {
 }
 
 // 查询部门下拉树结构
-export function deptTreeSelect() {
+export function deptTreeSelect(data) {
   return request({
     url: '/system/user/deptTree',
-    method: 'get'
+    method: 'get',
+    params: data
   })
 }

二进制
src/assets/images/homePage.png


+ 145 - 0
src/components/PopDialog/dose.vue

@@ -0,0 +1,145 @@
+<template>
+  <div>
+    <el-dialog
+      title="剂型选择"
+      width="500px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-main>
+            <el-row :gutter="10" class="content">
+              <el-col :span="12">
+                <el-input
+                  placeholder="输入关键字进行过滤"
+                  size="small"
+                  v-model="filterText">
+                </el-input>
+
+                <el-tree
+                  class="filter-tree"
+                  :data="threedata"
+                  :props="defaultProps"
+                  node-key="id"
+                  highlight-current
+                  @node-click="clickTree"
+                  :filter-node-method="filterNode"
+                  ref="tree">
+                </el-tree>
+              </el-col>
+            </el-row>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getDose } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      loading: false,
+      visible: false,
+      filterText: '',
+      threedata: [],
+      defaultProps: {
+        children: 'childrens',
+        label: 'name'
+      },
+      // 判断是否为最末级节点
+      isLast: false,
+      // 选中的节点
+      choosePoint: {}
+    };
+  },
+  props: {},
+  watch: {
+      filterText(val) {
+        this.$refs.tree.filter(val);
+      }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.refreshList()
+      });
+    },
+    // 获取数据列表
+    refreshList(data) {
+      this.loading = true;
+      getDose({}).then(res => {
+        console.log('res',res)
+        if(res.code === 200) {
+          this.threedata = res.data.tableBody
+        }
+        this.loading = false;
+      });
+    },
+    clickTree(data) {
+      console.log('树形节点信息:',data)
+      if (data.childrens.length == 0) {
+        this.isLast = true
+      } else {
+        this.isLast = false
+      }
+      this.choosePoint = data
+    },
+    filterNode(value, data) {
+      console.log('value', value)
+      console.log('data', data)
+        if (!value) return true;
+        return data.name.indexOf(value) !== -1;
+    },
+    doSubmit() {
+      if(this.isLast == false) {
+        this.$message({
+          message: '请选择最末级节点',
+          type: 'warning'
+        });
+      } else {
+        console.log('子组件选择的数据',this.choosePoint)
+        this.$emit("doSubmit", this.choosePoint);
+        this.visible = false;
+      }
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 236 - 0
src/components/PopDialog/dose_bak.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <el-dialog
+      title="剂型选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="id"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="code"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getDose } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getDose(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total;
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 133 - 0
src/components/PopDialog/drug.vue

@@ -0,0 +1,133 @@
+<template>
+  <div>
+    <el-dialog
+      title="药品类别"
+      width="500px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-main>
+            <el-row :gutter="10" class="content">
+              <el-col :span="12">
+                <el-input
+                  placeholder="输入关键字进行过滤"
+                  size="small"
+                  v-model="filterText">
+                </el-input>
+
+                <el-tree
+                  class="filter-tree"
+                  :data="threedata"
+                  :props="defaultProps"
+                  node-key="id"
+                  highlight-current
+                  @node-click="clickTree"
+                  :filter-node-method="filterNode"
+                  ref="tree">
+                </el-tree>
+              </el-col>
+            </el-row>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getDrug } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      loading: false,
+      visible: false,
+      filterText: '',
+      threedata: [],
+      defaultProps: {
+        children: 'childrens',
+        label: 'name'
+      },
+      // 判断是否为最末级节点
+      // isLast: false,
+      // 选中的节点
+      choosePoint: {}
+    };
+  },
+  props: {},
+  watch: {
+      filterText(val) {
+        this.$refs.tree.filter(val);
+      }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.refreshList()
+      });
+    },
+    // 获取数据列表
+    refreshList(data) {
+      this.loading = true;
+      getDrug({}).then(res => {
+        console.log('res',res)
+        if(res.code === 200) {
+          this.threedata = res.data.tableBody
+        }
+        this.loading = false;
+      });
+    },
+    clickTree(data) {
+      console.log('树形节点信息:',data)
+      this.choosePoint = data
+    },
+    filterNode(value, data) {
+      console.log('value', value)
+      console.log('data', data)
+        if (!value) return true;
+        return data.name.indexOf(value) !== -1;
+    },
+    doSubmit() {
+      console.log('子组件选择的数据',this.choosePoint)
+      this.$emit("doSubmit", this.choosePoint);
+      this.visible = false;
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 145 - 0
src/components/PopDialog/fourClass.vue

@@ -0,0 +1,145 @@
+<template>
+  <div>
+    <el-dialog
+      title="物料分类选择"
+      width="500px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-main>
+            <el-row :gutter="10" class="content">
+              <el-col :span="12">
+                <el-input
+                  placeholder="输入关键字进行过滤"
+                  size="small"
+                  v-model="filterText">
+                </el-input>
+
+                <el-tree
+                  class="filter-tree"
+                  :data="threedata"
+                  :props="defaultProps"
+                  node-key="id"
+                  highlight-current
+                  @node-click="clickTree"
+                  :filter-node-method="filterNode"
+                  ref="tree">
+                </el-tree>
+              </el-col>
+            </el-row>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getTree } from '@/api/classify/basic';
+export default {
+  data() {
+    return {
+      loading: false,
+      visible: false,
+      filterText: '',
+      threedata: [],
+      defaultProps: {
+        children: 'childrens',
+        label: 'materialType'
+      },
+      // 判断是否为最末级节点
+      isLast: false,
+      // 选中的节点
+      choosePoint: {}
+    };
+  },
+  props: {},
+  watch: {
+      filterText(val) {
+        this.$refs.tree.filter(val);
+      }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.refreshList()
+      });
+    },
+    // 获取数据列表
+    refreshList(data) {
+      this.loading = true;
+      getTree(data).then(res => {
+        console.log('res',res)
+        if(res.code === 200) {
+          this.threedata = res.rows
+        }
+        this.loading = false;
+      });
+    },
+    clickTree(data) {
+      console.log('树形节点信息:',data)
+      if (data.childrens.length == 0) {
+        this.isLast = true
+      } else {
+        this.isLast = false
+      }
+      this.choosePoint = data
+    },
+    filterNode(value, data) {
+      console.log('value', value)
+      console.log('data', data)
+        if (!value) return true;
+        return data.materialType.indexOf(value) !== -1;
+    },
+    doSubmit() {
+      if(this.isLast == false) {
+        this.$message({
+          message: '请选择最末级节点',
+          type: 'warning'
+        });
+      } else {
+        console.log('子组件选择的数据',this.choosePoint)
+        this.$emit("doSubmit", this.choosePoint);
+        this.visible = false;
+      }
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 26 - 47
src/components/PopDialog/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-dialog
-      title="物料选择"
+      title="物料编码选择"
       width="1000px"
       :close-on-click-modal="false"
       :append-to-body="true"
@@ -24,7 +24,7 @@
                 <el-input
                   size="small"
                   v-model="searchForm.code"
-                  placeholder="物料编号"
+                  placeholder="请输入物料编号查询"
                   clearable
                 ></el-input>
               </el-form-item>
@@ -32,7 +32,7 @@
                 <el-input
                   size="small"
                   v-model="searchForm.name"
-                  placeholder="物料名称"
+                  placeholder="请输入物料名称查询"
                   clearable
                 ></el-input>
               </el-form-item>
@@ -59,6 +59,7 @@
               size="small"
               border
               ref="contractTable"
+              @row-click="rowSelect"
               @select="handleSelectionChange"
               height="calc(100% - 40px)"
               style="width: 100%"
@@ -73,55 +74,29 @@
               <el-table-column
                 prop="code"
                 header-align="center"
-                align="left"
+                align="center"
                 sortable="custom"
                 min-width="90"
-                label="code"
+                label="物料编码"
               >
               </el-table-column>
               <el-table-column
                 prop="name"
                 header-align="center"
-                align="left"
+                align="center"
                 sortable="custom"
                 min-width="90"
                 label="物料名称"
               >
               </el-table-column>
-              <!-- <el-table-column
-                prop="contractAmount"
-                header-align="center"
-                align="left"
-                sortable="custom"
-                min-width="110"
-                label="合同金额"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="oppositeCompany"
-                header-align="center"
-                align="center"
-                sortable="custom"
-                min-width="110"
-                label="对方单位"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="signDate"
-                header-align="center"
-                align="left"
-                sortable="custom"
-                min-width="110"
-                label="签订时间"
-              >
-              </el-table-column> -->
             </el-table>
+
             <el-pagination
               @size-change="sizeChangeHandle"
               @current-change="currentChangeHandle"
-              :current-page="pageNo"
+              :current-page="searchForm.pageNo"
               :page-sizes="[5, 10, 15, 20]"
-              :page-size="pageSize"
+              :page-size="searchForm.pageSize"
               :total="total"
               layout="total, sizes, prev, pager, next, jumper"
             >
@@ -156,13 +131,13 @@ export default {
     return {
       searchForm: {
         code: '',
-        name: ''
+        name: '',
+        pageNo: 1,
+        pageSize: 10,
       },
       dataListAllSelections: [], // 所有选中的数据包含跨页数据
       idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
       dataList: [],
-      pageNo: 1,
-      pageSize: 10,
       total: 0,
       orders: [],
       loading: false,
@@ -202,14 +177,10 @@ export default {
       //     // orders: this.orders,
       //     // ...this.searchForm,
       //   },
-      getMaterialList({
-        pageNo: 1,
-        size: this.pageSize
-      }).then(({ data }) => {
+      getMaterialList(this.searchForm).then(({ data }) => {
         console.log('data',data)
         this.dataList = data.tableBody.rows;
         this.total = data.tableBody.total;
-        this.pageNo = data.current;
         this.loading = false;
         this.$nextTick(() => {
           this.setSelectRow();
@@ -218,20 +189,28 @@ export default {
     },
     // 每页数
     sizeChangeHandle(val) {
-      this.pageSize = val;
-      this.pageNo = 1;
+      console.log('每页数:', val)
+      this.searchForm.pageSize = val;
       this.refreshList();
     },
     // 当前页
     currentChangeHandle(val) {
-      this.pageNo = val;
+      console.log('当前页:', val)
+      this.searchForm.pageNo = val;
       this.refreshList();
     },
     // 排序
     resetSearch() {
-      this.$refs.searchForm.resetFields();
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
       this.refreshList();
     },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
     // 选中数据
     handleSelectionChange(selection, row) {
       if (this.single && selection.length > 1) {

+ 236 - 0
src/components/PopDialog/midPack.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <el-dialog
+      title="中包装单位选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="code"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="code"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getMidPack } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getMidPack(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 134 - 0
src/components/PopDialog/organization.vue

@@ -0,0 +1,134 @@
+<template>
+  <div>
+    <el-dialog
+      title="采购组织选择"
+      width="500px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-main>
+            <el-row :gutter="10" class="content">
+              <el-col :span="12">
+                <el-input
+                  placeholder="输入关键字进行过滤"
+                  size="small"
+                  v-model="filterText">
+                </el-input>
+
+                <el-tree
+                  class="filter-tree"
+                  :data="threedata"
+                  :props="defaultProps"
+                  node-key="id"
+                  highlight-current
+                  @node-click="clickTree"
+                  :filter-node-method="filterNode"
+                  ref="tree">
+                </el-tree>
+              </el-col>
+            </el-row>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getOrgs } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      loading: false,
+      visible: false,
+      filterText: '',
+      threedata: [],
+      defaultProps: {
+        children: 'children',
+        label: 'label'
+      },
+      // 判断是否为最末级节点
+      // isLast: false,
+      // 选中的节点
+      choosePoint: {},
+    };
+  },
+  props: {},
+  watch: {
+      filterText(val) {
+        this.$refs.tree.filter(val);
+      }
+  },
+  methods: {
+    init(val) {
+      this.visible = true;
+      this.$nextTick(() => {
+        console.log('接收参数了吗', val)
+        this.refreshList(val)
+      });
+    },
+    // 获取数据列表
+    refreshList(val) {
+      this.loading = true;
+      getOrgs({type: val}).then(res => {
+        console.log('res',res)
+        if(res.code === 200) {
+          this.threedata = res.data
+        }
+        this.loading = false;
+      });
+    },
+    clickTree(data) {
+      console.log('节点信息', data)
+      this.choosePoint = data
+    },
+    filterNode(value, data) {
+      console.log('value', value)
+      console.log('data', data)
+        if (!value) return true;
+        return data.label.indexOf(value) !== -1;
+    },
+    doSubmit() {
+      console.log('子组件选择的数据',this.choosePoint)
+      this.$emit("doSubmit", this.choosePoint);
+      this.visible = false;
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 236 - 0
src/components/PopDialog/place.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <el-dialog
+      title="产地选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="id"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="id"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getPlace } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getPlace(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 28 - 51
src/components/PopDialog/productFactory.vue

@@ -20,22 +20,22 @@
               @keyup.enter.native="refreshList()"
               @submit.native.prevent
             >
-              <el-form-item prop="code">
+              <el-form-item prop="param" label="名称/编号" >
                 <el-input
                   size="small"
-                  v-model="searchForm.code"
-                  placeholder="物料编号"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
                   clearable
                 ></el-input>
               </el-form-item>
-              <el-form-item prop="name">
+              <!-- <el-form-item prop="name">
                 <el-input
                   size="small"
                   v-model="searchForm.name"
-                  placeholder="物料名称"
+                  placeholder="名称"
                   clearable
                 ></el-input>
-              </el-form-item>
+              </el-form-item> -->
               <el-form-item>
                 <el-button
                   type="primary"
@@ -59,6 +59,7 @@
               size="small"
               border
               ref="contractTable"
+              @row-click="rowSelect"
               @select="handleSelectionChange"
               height="calc(100% - 40px)"
               style="width: 100%"
@@ -73,14 +74,14 @@
               <el-table-column
                 prop="code"
                 header-align="center"
-                align="left"
+                align="center"
                 sortable="custom"
                 min-width="90"
                 label="code"
               >
               </el-table-column>
               <el-table-column
-                prop="manufactureName"
+                prop="name"
                 header-align="center"
                 align="left"
                 sortable="custom"
@@ -88,40 +89,13 @@
                 label="名称"
               >
               </el-table-column>
-              <!-- <el-table-column
-                prop="contractAmount"
-                header-align="center"
-                align="left"
-                sortable="custom"
-                min-width="110"
-                label="合同金额"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="oppositeCompany"
-                header-align="center"
-                align="center"
-                sortable="custom"
-                min-width="110"
-                label="对方单位"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="signDate"
-                header-align="center"
-                align="left"
-                sortable="custom"
-                min-width="110"
-                label="签订时间"
-              >
-              </el-table-column> -->
             </el-table>
             <el-pagination
               @size-change="sizeChangeHandle"
               @current-change="currentChangeHandle"
-              :current-page="pageNo"
+              :current-page="searchForm.pageNo"
               :page-sizes="[5, 10, 15, 20]"
-              :page-size="pageSize"
+              :page-size="searchForm.pageSize"
               :total="total"
               layout="total, sizes, prev, pager, next, jumper"
             >
@@ -154,14 +128,15 @@ export default {
   data() {
     return {
       searchForm: {
-        code: '',
-        name: ''
+        // code: '',
+        // name: '',
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
       },
       dataListAllSelections: [], // 所有选中的数据包含跨页数据
       idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
       dataList: [],
-      pageNo: 1,
-      pageSize: 10,
       total: 0,
       orders: [],
       loading: false,
@@ -201,14 +176,10 @@ export default {
       //     // orders: this.orders,
       //     // ...this.searchForm,
       //   },
-      getProductFactory({
-        pageNo: 1,
-        size: this.pageSize
-      }).then(({ data }) => {
+      getProductFactory(this.searchForm).then(({ data }) => {
         console.log('data',data)
         this.dataList = data.tableBody;
-        this.total = data.tableBody.length;
-        this.pageNo = data.current;
+        this.total = data.total;
         this.loading = false;
         this.$nextTick(() => {
           this.setSelectRow();
@@ -217,20 +188,26 @@ export default {
     },
     // 每页数
     sizeChangeHandle(val) {
-      this.pageSize = val;
-      this.pageNo = 1;
+      this.searchForm.pageSize = val;
       this.refreshList();
     },
     // 当前页
     currentChangeHandle(val) {
-      this.pageNo = val;
+      this.searchForm.pageNo = val;
       this.refreshList();
     },
     // 排序
     resetSearch() {
-      this.$refs.searchForm.resetFields();
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
       this.refreshList();
     },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
     // 选中数据
     handleSelectionChange(selection, row) {
       if (this.single && selection.length > 1) {

+ 236 - 0
src/components/PopDialog/serviceline.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <el-dialog
+      title="业务线选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="code"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="code"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getLine } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getLine(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total;
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 236 - 0
src/components/PopDialog/staff.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <el-dialog
+      title="采购员选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="code"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="code"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getStaff } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getStaff(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total;
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 236 - 0
src/components/PopDialog/tax.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <el-dialog
+      title="物料税类选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="code"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="code"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getTax } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getTax(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total;
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 237 - 0
src/components/PopDialog/unit.vue

@@ -0,0 +1,237 @@
+<template>
+  <div>
+    <el-dialog
+      title="计量单位选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="refreshList()"
+              @submit.native.prevent
+            >
+            <el-form-item prop="param" label="名称/编号" >
+                <el-input
+                  size="small"
+                  v-model="searchForm.param"
+                  placeholder="输入名称/编号查询"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="refreshList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              @row-click="rowSelect"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="code"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="code"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="center"
+                sortable="custom"
+                min-width="90"
+                label="名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="searchForm.pageNo"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="searchForm.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getUnit } from '@/api/requisition/basic'
+export default {
+  data() {
+    return {
+      searchForm: {
+        param: '',
+        pageNo: 1,
+        pageSize: 10,
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    refreshList() {
+      this.loading = true;
+      getUnit(this.searchForm).then(({ data }) => {
+        console.log('data',data)
+        this.dataList = data.tableBody;
+        this.total = data.total;
+        this.loading = false;
+        this.$nextTick(() => {
+          this.setSelectRow();
+        });
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.searchForm.pageSize = val;
+      this.refreshList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.searchForm.pageNo = val;
+      this.refreshList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs['searchForm'].resetFields();
+      this.searchForm.pageNo = 1;
+      this.refreshList();
+    },
+    // 表格选中数据
+    rowSelect(row, column, event) {
+      this.$refs.contractTable.clearSelection();
+      this.$refs.contractTable.toggleRowSelection(row);
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      console.log('selection11', selection)
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 4 - 4
src/layout/components/Navbar.vue

@@ -9,13 +9,13 @@
       <template v-if="device!=='mobile'">
         <search id="header-search" class="right-menu-item" />
         
-        <el-tooltip content="源码地址" effect="dark" placement="bottom">
+        <!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">
           <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
+        </el-tooltip> -->
 
-        <el-tooltip content="文档地址" effect="dark" placement="bottom">
+        <!-- <el-tooltip content="文档地址" effect="dark" placement="bottom">
           <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
+        </el-tooltip> -->
 
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 

+ 1 - 1
src/layout/components/Sidebar/Logo.vue

@@ -35,7 +35,7 @@ export default {
   },
   data() {
     return {
-      title: '德荣供应链管理平台',
+      title: '德荣资源平台',
       logo: logoImg
     }
   }

+ 3 - 1
src/router/index.js

@@ -130,7 +130,9 @@ export const constantRoutes = [
     children: [
       {
         path: `detail/:id`,
-        component: () => import('@/views/material/basicFile/details')
+        name: 'materialDetail',
+        component: () => import('@/views/material/basicFile/details'),
+        meta: { title: '基本信息详情' }
       }
 
     ]

+ 4 - 3
src/store/getters.js

@@ -12,8 +12,9 @@ const getters = {
   roles: state => state.user.roles,
   permissions: state => state.user.permissions,
   permission_routes: state => state.permission.routes,
-  topbarRouters:state => state.permission.topbarRouters,
-  defaultRoutes:state => state.permission.defaultRoutes,
-  sidebarRouters:state => state.permission.sidebarRouters,
+  topbarRouters: state => state.permission.topbarRouters,
+  defaultRoutes: state => state.permission.defaultRoutes,
+  sidebarRouters: state => state.permission.sidebarRouters,
+  query: state => state.query,
 }
 export default getters

+ 3 - 1
src/store/index.js

@@ -7,6 +7,7 @@ import tagsView from './modules/tagsView'
 import permission from './modules/permission'
 import settings from './modules/settings'
 import getters from './getters'
+import query from './material/query'
 
 Vue.use(Vuex)
 
@@ -17,7 +18,8 @@ const store = new Vuex.Store({
     user,
     tagsView,
     permission,
-    settings
+    settings,
+    query
   },
   getters
 })

+ 13 - 2
src/store/material/query.js

@@ -1,17 +1,28 @@
 const query = {
 
   state: {
+    queryVlue: {}
+  },
+  getters: {
+    getQuery(state) {
 
+      return state.queryVlue;
+    }
   },
 
   mutations: {
-    setData: (state) => {
 
+    SET_QUERY: (state, value) => {
+      console.log(state, 'value', value,);
+      state.queryVlue = value;
     }
+
   },
 
   actions: {
-
+    reflashQuery(store, value) {
+      store.commit('SET_QUERY', value);
+    }
   }
 }
 

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

@@ -8,7 +8,12 @@ const user = {
     name: '',
     avatar: '',
     roles: [],
-    permissions: []
+    permissions: [],
+    nickName: '',
+    deptId: '',
+    deptName: '',
+    orgId: '',
+    orgName: ''
   },
 
   mutations: {
@@ -29,7 +34,22 @@ const user = {
     },
     SET_PERMISSIONS: (state, permissions) => {
       state.permissions = permissions
-    }
+    },
+    NICKNAME: (state, nickName) => {
+      state.nickName = nickName
+    },
+    DEPTID: (state, deptId) => {
+      state.deptId = deptId
+    },
+    DEPTNAME: (state, deptName) => {
+      state.deptName = deptName
+    },
+    ORGID: (state, orgId) => {
+      state.orgId = orgId
+    },
+    ORGNAME: (state, orgName) => {
+      state.orgName = orgName
+    },
   },
 
   actions: {
@@ -65,6 +85,11 @@ const user = {
           commit('SET_NAME', user.userName)
           commit('SET_ID', user.userId)
           commit('SET_AVATAR', avatar)
+          commit('NICKNAME', user.nickName)
+          commit('DEPTID', user.deptId)
+          commit('DEPTNAME', user.deptName)
+          commit('ORGID', user.orgId)
+          commit('ORGNAME', user.orgName)
           resolve(res)
         }).catch(error => {
           reject(error)

+ 155 - 113
src/utils/request.js

@@ -1,109 +1,140 @@
-import axios from 'axios'
-import { Notification, MessageBox, Message, Loading } from 'element-ui'
-import store from '@/store'
-import { getToken } from '@/utils/auth'
-import errorCode from '@/utils/errorCode'
+import axios from "axios";
+import { Notification, MessageBox, Message, Loading } from "element-ui";
+import store from "@/store";
+import { getToken } from "@/utils/auth";
+import errorCode from "@/utils/errorCode";
 import { tansParams, blobValidate } from "@/utils/ruoyi";
-import cache from '@/plugins/cache'
-import { saveAs } from 'file-saver'
-import judgeFileFormat from '@/views/material/tools/attachment-file'
+import cache from "@/plugins/cache";
+import { saveAs } from "file-saver";
+import judgeFileFormat from "@/views/material/tools/attachment-file";
 
 let downloadLoadingInstance;
 // 是否显示重新登录
 export let isRelogin = { show: false };
 
-axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
 // 创建axios实例
 const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: process.env.VUE_APP_BASE_API,
   // 超时
-  timeout: 10000
-})
+  timeout: 10000,
+});
 
 // request拦截器
-service.interceptors.request.use(config => {
-  // 是否需要设置 token
-  const isToken = (config.headers || {}).isToken === false
-  // 是否需要防止数据重复提交
-  const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
-  if (getToken() && !isToken) {
-    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
-  }
-  // get请求映射params参数
-  if (config.method === 'get' && config.params) {
-    let url = config.url + '?' + tansParams(config.params);
-    url = url.slice(0, -1);
-    config.params = {};
-    config.url = url;
-  }
-  if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
-    const requestObj = {
-      url: config.url,
-      data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
-      time: new Date().getTime()
+service.interceptors.request.use(
+  (config) => {
+    // 是否需要设置 token
+    const isToken = (config.headers || {}).isToken === false;
+    // 是否需要防止数据重复提交
+    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
+    if (getToken() && !isToken) {
+      config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
     }
-    const sessionObj = cache.session.getJSON('sessionObj')
-    if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
-      cache.session.setJSON('sessionObj', requestObj)
-    } else {
-      const s_url = sessionObj.url;                  // 请求地址
-      const s_data = sessionObj.data;                // 请求数据
-      const s_time = sessionObj.time;                // 请求时间
-      const interval = 1000;                         // 间隔时间(ms),小于此时间视为重复提交
-      if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
-        const message = '数据正在处理,请勿重复提交';
-        console.warn(`[${s_url}]: ` + message)
-        return Promise.reject(new Error(message))
+    // get请求映射params参数
+    if (config.method === "get" && config.params) {
+      let url = config.url + "?" + tansParams(config.params);
+      url = url.slice(0, -1);
+      config.params = {};
+      config.url = url;
+    }
+    if (
+      !isRepeatSubmit &&
+      (config.method === "post" || config.method === "put")
+    ) {
+      const requestObj = {
+        url: config.url,
+        data:
+          typeof config.data === "object"
+            ? JSON.stringify(config.data)
+            : config.data,
+        time: new Date().getTime(),
+      };
+      const sessionObj = cache.session.getJSON("sessionObj");
+      if (
+        sessionObj === undefined ||
+        sessionObj === null ||
+        sessionObj === ""
+      ) {
+        cache.session.setJSON("sessionObj", requestObj);
       } else {
-        cache.session.setJSON('sessionObj', requestObj)
+        const s_url = sessionObj.url; // 请求地址
+        const s_data = sessionObj.data; // 请求数据
+        const s_time = sessionObj.time; // 请求时间
+        const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
+        if (
+          s_data === requestObj.data &&
+          requestObj.time - s_time < interval &&
+          s_url === requestObj.url
+        ) {
+          const message = "数据正在处理,请勿重复提交";
+          console.warn(`[${s_url}]: ` + message);
+          return Promise.reject(new Error(message));
+        } else {
+          cache.session.setJSON("sessionObj", requestObj);
+        }
       }
     }
+    return config;
+  },
+  (error) => {
+    console.log(error);
+    Promise.reject(error);
   }
-  return config
-}, error => {
-  console.log(error)
-  Promise.reject(error)
-})
+);
 
 // 响应拦截器
-service.interceptors.response.use(res => {
-  // 未设置状态码则默认成功状态
-  const code = res.data.code || 200;
-  // 获取错误信息
-  const msg = errorCode[code] || res.data.msg || errorCode['default']
-  // 二进制数据则直接返回
-  if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
-    return res.data
-  }
-  if (code === 401) {
-    if (!isRelogin.show) {
-      isRelogin.show = true;
-      MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
-        isRelogin.show = false;
-        store.dispatch('LogOut').then(() => {
-          location.href = '/index';
-        })
-      }).catch(() => {
-        isRelogin.show = false;
-      });
+service.interceptors.response.use(
+  (res) => {
+    // 未设置状态码则默认成功状态
+    const code = res.data.code || 200;
+    // 获取错误信息
+    const msg = errorCode[code] || res.data.msg || errorCode["default"];
+    // 二进制数据则直接返回
+    if (
+      res.request.responseType === "blob" ||
+      res.request.responseType === "arraybuffer"
+    ) {
+      return res.data;
     }
-    return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
-  } else if (code === 500) {
-    Message({ message: msg, type: 'error' })
-    return Promise.reject(new Error(msg))
-  } else if (code === 601) {
-    Message({ message: msg, type: 'warning' })
-    return Promise.reject('error')
-  } else if (code !== 200) {
-    Notification.error({ title: msg })
-    return Promise.reject('error')
-  } else {
-    return res.data
-  }
-},
-  error => {
-    console.log('err' + error)
+    if (code === 401) {
+      if (!isRelogin.show) {
+        isRelogin.show = true;
+        MessageBox.confirm(
+          "登录状态已过期,您可以继续留在该页面,或者重新登录",
+          "系统提示",
+          {
+            confirmButtonText: "重新登录",
+            cancelButtonText: "取消",
+            type: "warning",
+          }
+        )
+          .then(() => {
+            isRelogin.show = false;
+            store.dispatch("LogOut").then(() => {
+              location.href = "/index";
+            });
+          })
+          .catch(() => {
+            isRelogin.show = false;
+          });
+      }
+      return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
+    } else if (code === 500) {
+      Message({ message: msg, type: "error" });
+      return Promise.reject(new Error(msg));
+    } else if (code === 601) {
+      Message({ message: msg, type: "warning" });
+      return Promise.reject("error");
+    } else if (code !== 200) {
+      Notification.error({ title: msg });
+      return Promise.reject("error");
+    } else {
+      return res.data;
+    }
+  },
+  (error) => {
+    console.log("err" + error);
     let { message } = error;
     if (message == "Network Error") {
       message = "后端接口连接异常";
@@ -112,37 +143,48 @@ service.interceptors.response.use(res => {
     } else if (message.includes("Request failed with status code")) {
       message = "系统接口" + message.substr(message.length - 3) + "异常";
     }
-    Message({ message: message, type: 'error', duration: 5 * 1000 })
-    return Promise.reject(error)
+    Message({ message: message, type: "error", duration: 5 * 1000 });
+    return Promise.reject(error);
   }
-)
+);
 
 // 通用下载方法
 export function download(url, params, filename, config) {
-  downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
-  return service.post(url, params, {
-    transformRequest: [(params) => { return tansParams(params) }],
-    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-    responseType: 'blob',
-    ...config
-  }).then(async (data) => {
-    const isBlob = blobValidate(data);
-    if (isBlob) {
-      const blob = new Blob([data])
-      saveAs(blob, filename)
-    } else {
-      const resText = await data.text();
-      const rspObj = JSON.parse(resText);
-      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
-      Message.error(errMsg);
-    }
-    downloadLoadingInstance.close();
-  }).catch((r) => {
-    console.error(r)
-    Message.error('下载文件出现错误,请联系管理员!')
-    downloadLoadingInstance.close();
-  })
+  downloadLoadingInstance = Loading.service({
+    text: "正在下载数据,请稍候",
+    spinner: "el-icon-loading",
+    background: "rgba(0, 0, 0, 0.7)",
+  });
+  return service
+    .post(url, params, {
+      transformRequest: [
+        (params) => {
+          return tansParams(params);
+        },
+      ],
+      headers: { "Content-Type": "application/x-www-form-urlencoded" },
+      responseType: "blob",
+      ...config,
+    })
+    .then(async (data) => {
+      const isBlob = blobValidate(data);
+      if (isBlob) {
+        const blob = new Blob([data]);
+        saveAs(blob, filename);
+      } else {
+        const resText = await data.text();
+        const rspObj = JSON.parse(resText);
+        const errMsg =
+          errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
+        Message.error(errMsg);
+      }
+      downloadLoadingInstance.close();
+    })
+    .catch((r) => {
+      console.error(r);
+      Message.error("下载文件出现错误,请联系管理员!");
+      downloadLoadingInstance.close();
+    });
 }
 
-
-export default service
+export default service;

文件差异内容过多而无法显示
+ 591 - 182
src/views/business/spd/bo/basic/details.vue


+ 189 - 100
src/views/business/spd/bo/basic/index.vue

@@ -10,18 +10,18 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="商机来源" prop="boSource">
-        <el-select v-model="queryParams.boSource" placeholder="请输入商机来源">
+      <el-form-item label="商机类型" prop="boType">
+        <el-select v-model="form.boType" placeholder="请输入商机类型" clearable>
           <el-option
-            v-for="dict in dict.type.mk_bo_source"
+            v-for="dict in dict.type.mk_bo_type"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="商机状态" prop="boState">
-        <el-select v-model="queryParams.boState" placeholder="请输入商机状态">
+      <el-form-item label="商机状态" prop="boState" clearable>
+        <el-select v-model="queryParams.boState" placeholder="请输入商机状态" clearable>
           <el-option
             v-for="dict in dict.type.mk_bo_state"
             :key="dict.value"
@@ -30,8 +30,18 @@
           ></el-option>
         </el-select>
       </el-form-item>
+      <el-form-item label="商机来源" prop="boSource">
+        <el-select v-model="queryParams.boSource" placeholder="请输入商机来源" clearable>
+          <el-option
+            v-for="dict in dict.type.mk_bo_source"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="商机阶段" prop="boStage">
-        <el-select v-model="queryParams.boStage" placeholder="请输入商机阶段">
+        <el-select v-model="queryParams.boStage" placeholder="请输入商机阶段" clearable>
           <el-option
             v-for="dict in dict.type.mk_bo_stage"
             :key="dict.value"
@@ -70,7 +80,6 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['system:basic:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -81,7 +90,6 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['system:basic:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -92,19 +100,8 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['system:basic:remove']"
         >删除</el-button>
       </el-col>
-      <!-- <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['system:basic:export']"
-        >导出</el-button>
-      </el-col> -->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -132,42 +129,39 @@
         </template>
       </el-table-column>
       <el-table-column label="客户名称" align="center" prop="customerName" />
-      <el-table-column label="推荐人" align="center" prop="referrer" />
-      <el-table-column label="医院营收总额" align="center" prop="totalHosRevenue" >
-        <template slot-scope="scope">
-          <dict-tag :options="dict.type.mk_bo_total_revenue" :value="scope.row.totalHosRevenue"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="医院耗材预估值" align="center" prop="hosDiscreetValue" />
-      <el-table-column label="商机内容" align="center" prop="boContent" />
-      <el-table-column label="销售区域" align="center" prop="marketingArea" />
+      <el-table-column label="医院耗材预估值(万元)" align="center" prop="hosDiscreetValue" />
+      <el-table-column label="赢单率" align="center" prop="winningRate" />
+      <el-table-column label="销售区域" align="center" prop="marketingAreaName" />
       <el-table-column label="销售组织" align="center" prop="marketingOrganizingName" />
       <el-table-column label="部门" align="center" prop="deptName" />
       <el-table-column label="商机负责人" align="center" prop="principalName" />
       <el-table-column label="创建人" align="center" prop="createBy" />
       <el-table-column label="创建时间" align="center" prop="createTime" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
-            icon="el-icon-edit"
+            icon="el-icon-top"
+            @click="submitOa(scope.row)"
+          >提交</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
             @click="enterDetails(scope.row)"
-            v-hasPermi="['system:basic:edit']"
           >进入详情</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:basic:edit']"
           >修改</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['system:basic:remove']"
           >删除</el-button>
         </template>
       </el-table-column>
@@ -184,10 +178,11 @@
     <!-- 添加或修改商机基础信息对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-divider content-position="left" style="font-size: 30px">基本信息</el-divider>
         <el-row>
           <el-col :span="8">
             <el-form-item label="商机名称" prop="boName">
-              <el-input v-model="form.boName" placeholder="请输入商机名称" :disabled="true"/>
+              <el-input v-model="form.boName" placeholder="商机名称自动生成" :disabled="true"/>
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -203,15 +198,17 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="推荐人" prop="referrer">
-              <el-input v-model="form.referrer" placeholder="请输入推荐人" />
+            <el-form-item label="推荐人" prop="referrerName" v-show="form.boSource == 2" :rules="form.boSource == 2 ? rules.referrer : [{require: false}]">
+              <el-input v-model="form.referrerName" placeholder="请输入推荐人" >
+                <el-button slot="append" icon="el-icon-more" @click="refereStaff"></el-button>
+              </el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="8">
             <el-form-item label="商机类型" prop="boType">
-              <el-select v-model="form.boType" placeholder="商机类型">
+              <el-select v-model="form.boType" placeholder="商机类型" :disabled = "this.operatingState == 'Update'">
                 <el-option
                   v-for="dict in dict.type.mk_bo_type"
                   :key="dict.value"
@@ -223,8 +220,8 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="客户名称" prop="customerName">
-              <el-input v-model="form.customerName" placeholder="请输入客户" >
-                <el-button slot="append" icon="el-icon-more" @click="refereCustomer"></el-button>
+              <el-input v-model="form.customerName" placeholder="请输入客户" :disabled = "this.operatingState == 'Update'">
+                <el-button slot="append" icon="el-icon-more" @click="refereCustomer" :disabled = "this.operatingState == 'Update'"></el-button>
               </el-input>
             </el-form-item>
           </el-col>
@@ -243,42 +240,55 @@
         </el-row>
         <el-row>
           <el-col :span="8">
-            <el-form-item label="医院耗材预估值" prop="hosDiscreetValue">
+            <el-form-item label="医院耗材预估值(万元)" prop="hosDiscreetValue">
               <el-input v-model="form.hosDiscreetValue" placeholder="请输入医院耗材预估值" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
-            <el-form-item label="销售区域" prop="marketingArea">
-              <el-input v-model="form.marketingArea" placeholder="请输入销售区域" />
+        </el-row>
+        <el-row>
+          <el-col>
+            <el-form-item label="商机内容"  prop="boContent">
+              <el-input
+                type="textarea"
+                :rows="2"
+                placeholder="请输入商机内容"
+                autosize
+                v-model="form.boContent">
+              </el-input>
             </el-form-item>
           </el-col>
         </el-row>
+        <el-divider content-position="left" style="font-size: 30px">其它信息</el-divider>
         <el-row>
-          <el-col :span="8">
+          <el-col :span="6">
+            <el-form-item label="销售区域" prop="marketingAreaName">
+              <el-input v-model="form.marketingAreaName" placeholder="请输入销售区域">
+                <el-button slot="append" icon="el-icon-more" @click="refereSaleaea"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
             <el-form-item label="销售组织" prop="marketingOrganizingName">
-              <el-input v-model="form.marketingOrganizingName">
-                <el-button slot="append" icon="el-icon-more" @click="refereOrg"></el-button>
+              <el-input v-model="form.marketingOrganizingName" :disabled="true">
+                <!-- <el-button slot="append" icon="el-icon-more" @click="refereOrg"></el-button> -->
               </el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="部门" prop="deptName">
-              <el-input v-model="form.deptName">
-                <el-button slot="append" icon="el-icon-more" @click="refereDept"></el-button>
+              <el-input v-model="form.deptName" :disabled="true">
+                <!-- <el-button slot="append" icon="el-icon-more" @click="refereDept"></el-button> -->
               </el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="商机负责人" prop="principalName">
-              <el-input v-model="form.principalName">
-                <el-button slot="append" icon="el-icon-more" @click="refereStaff"></el-button>
+              <el-input v-model="form.principalName" :disabled="true">
+                <!-- <el-button slot="append" icon="el-icon-more" @click="refereStaff"></el-button> -->
               </el-input>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="商机内容">
-          <editor v-model="form.boContent" :min-height="192"/>
-        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -291,6 +301,12 @@
       @doSubmit="customerSelectionsToInput"
       :single="true"
     />
+    <!-- 销售区域参照 -->
+    <SaleaeaRef
+      ref="saleaeaSelect"
+      @doSubmit="saleaeaSelectionsToInput"
+      :single="true"
+    />
     <!-- 组织参照 -->
     <OrgRef
       ref="orgSelect"
@@ -313,8 +329,9 @@
 </template>
 
 <script>
-import { listBasic, getBasic, addBasic, updateBasic, delBasic } from "@/api/business/spd/bo/basic";
+import { listBasic, getBasic, addBasic, updateBasic, delBasic ,submit} from "@/api/business/spd/bo/basic";
 import CustomerRef from '@/views/business/spd/bo/refer/customer/index.vue';
+import SaleaeaRef from '@/views/business/spd/bo/refer/saleaea/index.vue';
 import OrgRef from '@/views/business/spd/bo/refer/org/index.vue';
 import DeptRef from '@/views/business/spd/bo/refer/dept/index.vue';
 import StaffRef from '@/views/business/spd/bo/refer/staff/index.vue';
@@ -322,7 +339,7 @@ import StaffRef from '@/views/business/spd/bo/refer/staff/index.vue';
 export default {
   name: "Basic",
   dicts: ['mk_bo_type','mk_bo_state','mk_bo_stage','mk_bo_source','mk_bo_total_revenue'],
-  components: {CustomerRef,OrgRef,DeptRef,StaffRef},
+  components: {CustomerRef,SaleaeaRef,OrgRef,DeptRef,StaffRef},
   data() {
     return {
       // 遮罩层
@@ -343,64 +360,105 @@ export default {
       title: "",
       // 是否显示弹出层
       open: false,
+      //当前操作状态
+      operatingState: '',
       // 查询参数
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         id: null,
-        boName: null,
-        boType: null,
-        boState: null,
         boSource: null,
+        boState: null,
         boStage: null,
+        boName: null,
+        referrer: null,
+        referrerName: null,
+        boType: null,
+        customerName: null,
         totalHosRevenue: null,
-        projectApproval: null,
-        startWinningRate: null,
-        endWinningRate: null,
-        biddingDocumentsPass: null,
-        startConSignTime: null,
-        endConSignTime: null,
+        hosDiscreetValue: null,
+        boContent: null,
+        marketingArea: null,
+        marketingAreaName: null,
+        marketingOrganizing: null,
         marketingOrganizingName: null,
         marketingArea: null,
+        dept: null,
         deptName: null,
+        principal: null,
+        principalName: null,
+        delFlag: null,
+        tenantId: null,
+        revision: null,
         createBy: null,
-        startCreateTime: null,
-        endCreateTime: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null
       },
       // 表单参数
       form: {},
-      // 表单校验
-      // rules: {
-      //   boSource: [
-      //     { required: true, message: "商机来源不能为空", trigger: "blur" }
-      //   ],
-      //   boName: [
-      //     { required: true, message: "商机名称不能为空", trigger: "blur" }
-      //   ],
-      //   customerName: [
-      //     { required: true, message: "客户名称不能为空", trigger: "blur" }
-      //   ],
-      //   totalHosRevenue: [
-      //     { required: true, message: "医院营收总额不能为空", trigger: "blur" }
-      //   ],
-      //   hosDiscreetValue: [
-      //     { required: true, message: "医院耗材预估值不能为空", trigger: "blur" }
-      //   ],
-      //   boContent: [
-      //     { required: true, message: "商机内容不能为空", trigger: "blur" }
-      //   ],
-      //   marketingOrganizing: [
-      //     { required: true, message: "销售组织不能为空", trigger: "blur" }
-      //   ],
-      //   marketingArea: [
-      //     { required: true, message: "销售区域不能为空", trigger: "blur" }
-      //   ],
-      //   deptName: [
-      //     { required: true, message: "部门不能为空", trigger: "blur" }
-      //   ],
-      // }
+      //表单校验
+      rules: {
+        boSource: [
+          { required: true, message: "商机来源不能为空", trigger: "blur" }
+        ],
+        referrer: [
+          { required: true, message: "推荐人不能为空", trigger: "blur" }
+        ],
+        boType: [
+          { required: true, message: "商机类型不能为空", trigger: "blur" }
+        ],
+        customerName: [
+          { required: true, message: "客户名称不能为空", trigger: "blur" }
+        ],
+        totalHosRevenue: [
+          { required: true, message: "医院营收总额不能为空", trigger: "blur" }
+        ],
+        hosDiscreetValue: [
+          { required: true, message: "医院耗材预估值不能为空", trigger: "blur" },
+          { type: "number", message: '请输入数值', trigger: 'blur' }
+        ],
+        boContent: [
+          { required: true, message: "商机内容不能为空", trigger: "blur" }
+        ],
+      },
     };
   },
+  //监听属性
+  watch:{
+    //阶段
+    'form.totalHosRevenue':{
+      handler(newName, oldName) {
+        switch(newName) {
+          //5000万以下
+          case '0':
+            this.form.hosDiscreetValue = 5000 * 0.2;
+            break;
+          //5000万-1亿
+          case '1':
+            this.form.hosDiscreetValue = 10000 * 0.2;
+            break;
+          //1亿-2亿
+          case '2':
+            this.form.hosDiscreetValue = 20000 * 0.2;
+            break;
+          //2亿-5亿
+          case '3':
+            this.form.hosDiscreetValue = 50000 * 0.2;
+            break;
+          //5亿-10亿
+          case '4':
+            this.form.hosDiscreetValue = 100000 * 0.2;
+            break;
+          //10亿以上
+          case '5':
+            this.form.hosDiscreetValue = 100000 * 0.2;
+            break;
+        }
+      },
+      immediate: true,
+    },
+  },
   created() {
     this.getList();
   },
@@ -428,11 +486,14 @@ export default {
         boStage: null,
         boName: null,
         referrer: null,
+        referrerName: null,
         boType: null,
         customerName: null,
         totalHosRevenue: null,
         hosDiscreetValue: null,
         boContent: null,
+        marketingArea: null,
+        marketingAreaName: null,
         marketingOrganizing: null,
         marketingOrganizingName: null,
         marketingArea: null,
@@ -470,6 +531,13 @@ export default {
     handleAdd() {
       this.reset();
       this.open = true;
+      this.operatingState = "Insert";
+      this.form.principal = this.$store.state.user.id;
+      this.form.principalName = this.$store.state.user.nickName;
+      this.form.dept = this.$store.state.user.deptId;
+      this.form.deptName = this.$store.state.user.deptName;
+      this.form.marketingOrganizing = this.$store.state.user.orgId;
+      this.form.marketingOrganizingName = this.$store.state.user.orgName;
       this.title = "添加商机基础信息";
     },
     /** 进入详情按钮操作 */
@@ -484,6 +552,7 @@ export default {
       getBasic(id).then(response => {
         this.form = response.data;
         this.open = true;
+        this.operatingState = "Update";
         this.title = "修改商机基础信息";
       });
     },
@@ -523,6 +592,17 @@ export default {
         ...this.queryParams
       }, `basic_${new Date().getTime()}.xlsx`)
     },
+    //  提交至OA进行审批
+    submitOa(row){
+      const id = row.id;
+      console.log('id',id);
+      this.$modal.confirm('确认提交【' + row.boName + '】吗?').then(function() {
+        return submit(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("提交成功");
+      }).catch(() => {});
+    },
     // 触发客户参照列表
     refereCustomer() {
       this.$refs.customerSelect.init()
@@ -532,6 +612,15 @@ export default {
       this.form.customer = selections[0].id;
       this.form.customerName = selections[0].name;
     },
+    // 触发销售区域参照列表
+    refereSaleaea() {
+      this.$refs.saleaeaSelect.init()
+    },
+    //销售区域参照列表选择后
+    saleaeaSelectionsToInput (selections) {
+      this.form.marketingArea = selections[0].id;
+      this.form.marketingAreaName = selections[0].name;
+    },
     // 触发组织参照列表
     refereOrg() {
       this.$refs.orgSelect.init()
@@ -556,8 +645,8 @@ export default {
     },
     //员工参照列表选择后
     staffSelectionsToInput (selections) {
-      this.form.principal = selections[0].userId;
-      this.form.principalName = selections[0].nickName;
+      this.form.referrer = selections[0].userId;
+      this.form.referrerName = selections[0].nickName;
     }
   }
 };

+ 440 - 39
src/views/business/spd/bo/behavior/behaviorList.vue

@@ -8,7 +8,6 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['system:behavior:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -19,7 +18,6 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['system:behavior:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -30,7 +28,6 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['system:behavior:remove']"
         >删除</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@@ -39,6 +36,7 @@
     <el-table v-loading="loading" :data="behaviorList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="负责人" align="center" prop="staffName" />
+      <el-table-column label="行动日期" align="center" prop="time" />
       <el-form-item label="行动日期" prop="time">
         <el-date-picker clearable
           v-model="form.time"
@@ -76,26 +74,24 @@
       <el-table-column label="销售组织" align="center" prop="salesOrgName" v-if="source == 'Behavior'"/>
       <el-table-column label="部门" align="center" prop="deptName" v-if="source == 'Behavior'"/>
 
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:behavior:edit']"
           >修改</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['system:behavior:remove']"
           >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -107,10 +103,11 @@
     <!-- 添加或修改行动对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-divider content-position="left">基本信息</el-divider>
         <el-row>
           <el-col :span="8">
-            <el-form-item label="任务id" prop="taskId">
-              <el-input v-model="form.taskId" placeholder="请输入任务id" />
+            <el-form-item label="任务" prop="taskId" v-if="!(this.source == 'BoDetails')">
+              <el-input v-model="form.taskCode" placeholder="请输入任务" :disabled="this.source == 'TaskList'"/>
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -138,13 +135,15 @@
         </el-row>
         <el-row>
           <el-col :span="8">
-            <el-form-item label="客户名称" prop="customerName">
-              <el-input v-model="form.customerName" placeholder="请输入客户名称" />
+            <el-form-item label="客户" prop="customerName">
+              <el-input v-model="form.customerName" placeholder="请输入客户" disabled="this.source == 'BoDetails' || this.source == 'TaskList'"/>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="联系人名称" prop="linkmanName">
-              <el-input v-model="form.linkmanName" placeholder="请输入联系人名称" />
+            <el-form-item label="联系人" prop="linkmanName">
+              <el-input v-model="form.linkmanName" placeholder="请输入联系人" >
+                <el-button slot="append" icon="el-icon-more" @click="refereContact"></el-button>
+              </el-input>
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -162,10 +161,10 @@
         </el-row>
         <el-row>
           <el-col  :span="8">
-            <el-form-item label="是否上级协助" prop="assist">
-              <el-select v-model="form.assist" placeholder="请输入是否上级协助">
+            <el-form-item label="拜访效果" prop="result">
+              <el-select v-model="form.result" placeholder="请输入拜访效果">
                 <el-option
-                  v-for="dict in dict.type.sys_yes_no"
+                  v-for="dict in dict.type.mk_bo_behavior_res"
                   :key="dict.value"
                   :label="dict.label"
                   :value="dict.value"
@@ -174,15 +173,10 @@
             </el-form-item>
           </el-col>
           <el-col  :span="8">
-            <el-form-item label="协助内容" prop="assistContent">
-              <el-input v-model="form.assistContent" placeholder="请输入协助内容" />
-            </el-form-item>
-          </el-col>
-          <el-col  :span="8">
-            <el-form-item label="拜访效果" prop="result">
-              <el-select v-model="form.result" placeholder="请输入拜访效果">
+            <el-form-item label="是否上级协助" prop="assist">
+              <el-select v-model="form.assist" placeholder="请输入是否上级协助">
                 <el-option
-                  v-for="dict in dict.type.mk_bo_behavior_res"
+                  v-for="dict in dict.type.sys_yes_no"
                   :key="dict.value"
                   :label="dict.label"
                   :value="dict.value"
@@ -190,43 +184,206 @@
               </el-select>
             </el-form-item>
           </el-col>
+          <el-col  :span="8">
+            <el-form-item label="协助内容" prop="assistContent" v-show="form.assist == 'Y'" :rules="form.assist == 'Y' ? rules.assistContent : [{require: false}]">
+              <el-input v-model="form.assistContent" placeholder="请输入协助内容" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="销售区域" prop="marketingAreaName">
+              <el-input v-model="form.marketingAreaName" placeholder="请输入销售区域">
+                <el-button slot="append" icon="el-icon-more" @click="refereSaleaea"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row>
           <el-col  :span="8">
-            <el-form-item label="销售组织名称" prop="salesOrgName">
-              <el-input v-model="form.salesOrgName" placeholder="请输入销售组织名称" />
+            <el-form-item label="销售组织" prop="salesOrgName">
+              <el-input v-model="form.salesOrgName" placeholder="请输入销售组织" :disabled="true"/>
             </el-form-item>
           </el-col>
           <el-col  :span="8">
-             <el-form-item label="部门名称" prop="deptName">
-              <el-input v-model="form.deptName" placeholder="请输入部门名称" />
+             <el-form-item label="部门" prop="deptName">
+              <el-input v-model="form.deptName" placeholder="请输入部门" :disabled="true"/>
             </el-form-item>
           </el-col>
           <el-col  :span="8">
-            <el-form-item label="负责人名称" prop="staffName">
-              <el-input v-model="form.staffName" placeholder="请输入负责人名称" />
+            <el-form-item label="负责人" prop="staffName">
+              <el-input v-model="form.staffName" placeholder="请输入负责人" :disabled="true"/>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="洽谈内容">
-          <editor v-model="form.content" :min-height="192"/>
+        <el-divider content-position="left">跟进记录</el-divider>
+        <el-form-item label="跟进记录" prop="content" >
+          <el-input
+            type="textarea"
+            :rows="2"
+            autosize
+            v-model="form.content">
+          </el-input>
         </el-form-item>
+        <!-- <el-divider content-position="left">照片信息</el-divider>
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button
+                type="info"
+                plain
+                icon="el-icon-upload2"
+                size="mini"
+                @click="handleImport(`P`)"
+                >上传</el-button
+              >
+            </el-col>
+          </el-row>
+          <el-image
+            style="width: 100px; height: 100px"
+            :src="url"
+            :preview-src-list="srcList">
+          </el-image>
+        <el-divider content-position="left">附件</el-divider>
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button
+                type="info"
+                plain
+                icon="el-icon-upload2"
+                size="mini"
+                @click="handleImport(`A`)"
+                >上传</el-button
+              >
+            </el-col>
+          </el-row>
+          <el-table v-loading="loading" :data="form.accessory">
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column
+              type="index"
+              label="序号"
+              width="55"
+              align="center"
+            />
+            <el-table-column label="名称" align="center" prop="fileName" />
+            <el-table-column
+              label="操作"
+              align="center"
+              class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope">
+                <el-row>
+                  <el-col :span="1.5">
+                    <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="deleteBehaviorA('list', scope.row)"
+                      >删除</el-button
+                    >
+                  </el-col>
+                  <el-col :span="1.5">
+                    <el-button
+                      type="warning"
+                      plain
+                      icon="el-icon-download"
+                      size="mini"
+                      @click="exportAccessory(scope.row.url, scope.row.Name)"
+                      >下载</el-button
+                    >
+                  </el-col>
+                </el-row>
+              </template>
+            </el-table-column>
+          </el-table> -->
+        <div class="md-auditInfo">
+          <el-divider content-position="left">其它信息</el-divider>
+          <el-form :inline="true" label-position="right" :model="form">
+            <el-row>
+              <el-col :span="6">
+                <el-form-item label="创建人">
+                  <el-input v-model="form.createBy" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="创建时间">
+                  <el-input v-model="form.createTime" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="修改人">
+                  <el-input v-model="form.updateBy" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="修改时间">
+                  <el-input v-model="form.updateTime" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+    <!-- 上传对话框 -->
+    <el-dialog
+      :title="upload.title"
+      :visible.sync="upload.open"
+      width="400px"
+      append-to-body
+    >
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls,.doc,docx"
+        :headers="upload.headers"
+        :action="1"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 联系人参照 -->
+    <ContactRef
+      ref="contactSelect"
+      @doSubmit="contactSelectionsToInput"
+      :single="true"
+      :outerQueryParams="this.bo"
+    />
+    <!-- 销售区域参照 -->
+    <SaleaeaRef
+      ref="saleaeaSelect"
+      @doSubmit="saleaeaSelectionsToInput"
+      :single="true"
+    />
   </div>
 </template>
 
 <script>
 import { listBehavior, getBehavior, delBehavior, addBehavior, updateBehavior } from "@/api/business/spd/bo/behavior";
+import {delBehaviorA} from "@/api/business/spd/bo/behaviorA";
+import ContactRef from '@/views/business/spd/bo/refer/contact/index.vue';
+import SaleaeaRef from '@/views/business/spd/bo/refer/saleaea/index.vue';
+import axios from "axios";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "BehaviorList",
   props:["source","bo"],
   dicts: ['mk_bo_behavior_res','mk_bo_behavior_type','sys_yes_no','mk_bo_behavior_goal'],
+  components: {ContactRef,SaleaeaRef},
   data() {
     return {
       // 遮罩层
@@ -252,20 +409,82 @@ export default {
         pageNum: 1,
         pageSize: 10,
         bo: null,
-        task: 1,
+        boStage: null,
+        boName: null,
+        task: null,
+        taskCode: null,
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
-      }
+        type: [
+          { required: true, message: "行动类型不能为空", trigger: "blur" }
+        ],
+        time: [
+          { required: true, message: "行动日期不能为空", trigger: "blur" }
+        ],
+        customerName: [
+          { required: true, message: "客户不能为空", trigger: "blur" }
+        ],
+        linkmanName: [
+          { required: true, message: "联系人不能为空", trigger: "blur" }
+        ],
+        purpose: [
+          { required: true, message: "拜访目的不能为空", trigger: "blur" }
+        ],
+        assist: [
+          { required: true, message: "是否需要上级协助不能为空", trigger: "blur" }
+        ],
+        assistContent: [
+          { required: true, message: "协助内容不能为空", trigger: "blur" }
+        ],
+        staffName: [
+          { required: true, message: "负责人不能为空", trigger: "blur" }
+        ],
+        content: [
+          { required: true, message: "洽谈内容不能为空", trigger: "blur" }
+        ],
+        result: [
+          { required: true, message: "拜访效果不能为空", trigger: "blur" }
+        ],
+      },
+      // 上传参数
+      upload: {
+        // 是否显示弹出层
+        open: false,
+        // 弹出层标题
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 上传类型
+        type: "",
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/mk/bo/behaviorA",
+      },
+      url: [
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+      ],
+      srcList: [
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg'
+      ],
     };
   },
   created() {
-    console.log("this.bo",this.bo);
-    this.queryParams.bo = this.bo.bo;
-    this.queryParams.task = this.bo.task;
-    this.queryParams.taskCode = this.bo.taskCode;
+    if(this.source == 'Behavior'){
+      this.queryParams = this.bo;
+    }
+    if(this.source == 'BoDetails'){
+      this.queryParams.bo = this.bo.id;
+      this.queryParams.boStage = this.bo.boStage;
+    }
+    if(this.source == 'TaskList'){
+      console.log('this.bo-----',this.bo);
+      this.queryParams.taskCode = this.bo.code;
+    }
     this.getList();
   },
   methods: {
@@ -287,6 +506,9 @@ export default {
     reset() {
       this.form = {
         id: null,
+        bo: null,
+        boName: null,
+        task: null,
         taskCode: null,
         type: null,
         time: null,
@@ -298,6 +520,8 @@ export default {
         result: null,
         assist: null,
         assistContent: null,
+        marketingArea: null,
+        marketingAreaName: null,
         salesOrg: null,
         salesOrgName: null,
         dept: null,
@@ -334,6 +558,31 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      //新增行动设置默认值
+      if(this.source == 'BoDetails'){
+        this.queryParams.bo = this.bo.id;
+        this.form.bo = this.bo.id;
+        this.form.boName = this.bo.boName;
+        this.form.boStage = this.bo.boStage;
+        this.form.customer = this.bo.customer;
+        this.form.customerName = this.bo.customerName;
+      }
+      if(this.source == 'TaskList'){
+        this.form.bo = this.bo.bo;
+        this.form.boName = this.bo.boName;
+        this.form.boStage = this.bo.boStage;
+        this.form.customer = this.bo.customer;
+        this.form.customerName = this.bo.customerName;
+        this.form.task = this.bo.id;
+        this.form.taskCode = this.bo.code;
+      }
+      this.form.type = '0';
+      this.form.staff = this.$store.state.user.id;
+      this.form.staffName = this.$store.state.user.nickName;
+      this.form.dept = this.$store.state.user.deptId;
+      this.form.deptName = this.$store.state.user.deptName;
+      this.form.salesOrg = this.$store.state.user.orgId;
+      this.form.salesOrgName = this.$store.state.user.orgName;
       this.open = true;
       this.title = "添加行动";
     },
@@ -382,7 +631,159 @@ export default {
       this.download('system/behavior/export', {
         ...this.queryParams
       }, `behavior_${new Date().getTime()}.xlsx`)
-    }
+    },
+    /** 上传按钮操作 */
+    handleImport(type) {
+      this.upload.open = true;
+      this.upload.type = type;
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(
+        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+          response.msg +
+          "</div>",
+        "上传结果",
+        { dangerouslyUseHTMLString: true }
+      );
+    },
+    //下载附件
+    exportBehaviorA(urlId, fileName) {
+      let resUrl =
+        "https://test-sy.derom.com/document-center/fastdfs/download?id=" +
+        urlId;
+      axios
+        .create({
+          timeout: 3000,
+          responseType: "blob", // 响应类型, 将响应数据转换为二进制数据
+          headers: {},
+        })
+        .get(resUrl)
+        .then((res) => {
+          console.log(res);
+          // 地址转换
+          let url = window.URL.createObjectURL(res.data);
+          const a = document.createElement("a");
+          a.setAttribute("href", url);
+          a.setAttribute("download", fileName);
+          document.body.append(a);
+          a.click();
+          document.body.removeChild(a);
+        });
+    },
+    //删除附件
+    deleteBehaviorA(row) {
+      this.$modal
+        .confirm("是否确认删除?")
+        .then(function () {})
+        .then(() => {
+          delBehaviorA(row.id).then((res) => {
+            if (res.code == 200) {
+              if (this.upload.flag == "list") {
+                listAccessory(this.form.basic.id).then((response) => {
+                  this.form.accessory = response.rows;
+                });
+              } else {
+                getBasic(this.$route.params.id).then((response) => {
+                  this.form.basic = response.data;
+                });
+              }
+              this.$modal.msgSuccess("删除成功");
+            } else {
+              this.$modal.msgSuccess("删除失败");
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    // 触发联系人参照列表
+    refereContact() {
+      this.$refs.contactSelect.init()
+    },
+    //联系人参照列表选择后
+    contactSelectionsToInput (selections) {
+      console.log('selections',selections);
+      this.form.linkman = selections[0].id;
+      this.form.linkmanName = selections[0].name;
+    },
+    // 触发销售区域参照列表
+    refereSaleaea() {
+      this.$refs.saleaeaSelect.init()
+    },
+    //销售区域参照列表选择后
+    saleaeaSelectionsToInput (selections) {
+      this.form.marketingArea = selections[0].id;
+      this.form.marketingAreaName = selections[0].name;
+    },
   }
 };
 </script>
+
+
+
+<style scoped>
+.md-content >>> .el-form-item {
+  margin-bottom: 10px;
+}
+
+.md-content >>> .el-tabs--border-card > .el-tabs__content {
+  padding-bottom: 8px;
+}
+
+.md-content .md-auditInfo >>> .el-form-item {
+  margin-bottom: 0px;
+}
+
+.md-main >>> .el-form-item,
+.md-vice >>> .el-form-item {
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.md-main >>> .el-form-item__label,
+.md-vice >>> .el-form-item__label {
+  width: 40%;
+}
+
+.md-main >>> .el-form-item__content,
+.md-md-vice >>> .el-form-item__content {
+  width: 60%;
+}
+
+.md-content >>> .el-form-item__label {
+  font-weight: normal;
+  /* text-align: left;
+  width: 28%; */
+  white-space: nowrap;
+  /* IE6 需要定义宽度 */
+  overflow: hidden;
+
+  -o-text-overflow: ellipsis;
+  /* Opera */
+  text-overflow: ellipsis;
+  /* IE, Safari (WebKit) */
+  /* -moz-binding: url('ellipsis.xml#ellipsis'); */
+  /* Firefox */
+}
+
+.md-main >>> .material-table {
+  height: 100%;
+}
+
+.md-vice >>> .material-table {
+  height: 140px;
+  overflow-y: auto;
+  overflow-x: auto;
+}
+</style>

+ 338 - 173
src/views/business/spd/bo/contact/contactList.vue

@@ -8,7 +8,6 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['system:contact:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -19,7 +18,6 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['system:contact:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -30,7 +28,6 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['system:contact:remove']"
         >删除</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -40,7 +37,6 @@
           icon="el-icon-download"
           size="mini"
           @click="handleExport"
-          v-hasPermi="['system:contact:export']"
         >导出</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@@ -50,13 +46,31 @@
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="编号" align="center" prop="code" />
       <el-table-column label="姓名" align="center" prop="name" />
-      <el-table-column label="性别" align="center" prop="gander" />
+      <el-table-column label="性别" align="center" prop="gander" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.gander"/>
+        </template>
+      </el-table-column>
       <el-table-column label="联系电话" align="center" prop="telephone" />
+      <el-table-column label="所属客户" align="center" prop="customerName" />
       <el-table-column label="部门名称" align="center" prop="departmentName" />
-      <el-table-column label="职务" align="center" prop="position" />
-      <el-table-column label="决策力" align="center" prop="power" />
-      <el-table-column label="状态" align="center" prop="state" />
+      <el-table-column label="职务" align="center" prop="position" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.mk_bo_position" :value="scope.row.position"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="决策力" align="center" prop="power" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.mk_bo_power" :value="scope.row.power"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="业务爱好" align="center" prop="hobby" />
       <el-table-column label="家庭地址" align="center" prop="address" />
+      <el-table-column label="状态" align="center" prop="state" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.mk_bo_contact_state" :value="scope.row.state"/>
+        </template>
+      </el-table-column>
       <!-- <el-table-column label="商机id" align="center" prop="boId" /> -->
       <!-- <el-table-column label="创建日期" align="center" prop="createDate" width="180">
         <template slot-scope="scope">
@@ -79,7 +93,6 @@
       <el-table-column label="职称" align="center" prop="jobTitle" />
       <el-table-column label="任职科室" align="center" prop="section" />
       <el-table-column label="上级联系人" align="center" prop="superiorContact" />
-      <el-table-column label="业务爱好" align="center" prop="hobby" />
       <el-table-column label="籍贯" align="center" prop="birthplace" />
       <el-table-column label="生日" align="center" prop="birthday" width="180">
         <template slot-scope="scope">
@@ -87,28 +100,26 @@
         </template>
       </el-table-column>
       <el-table-column label="联系人分类" align="center" prop="contactClassification" />
-      <el-table-column label="所属客户名称" align="center" prop="customerName" />
+
       <el-table-column label="所属客户编码" align="center" prop="customerCode" /> -->
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:contact:edit']"
           >修改</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['system:contact:remove']"
           >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -118,125 +129,274 @@
     />
 
     <!-- 添加或修改联系人管理对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="1100px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="商机id" prop="boId">
-          <el-input v-model="form.boId" placeholder="请输入商机id" />
-        </el-form-item>
-        <el-form-item label="创建日期" prop="createDate">
-          <el-date-picker clearable
-            v-model="form.createDate"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择创建日期">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="部门名称" prop="departmentName">
-          <el-input v-model="form.departmentName" placeholder="请输入部门名称" />
-        </el-form-item>
-        <el-form-item label="部门编码" prop="departmentCode">
-          <el-input v-model="form.departmentCode" placeholder="请输入部门编码" />
-        </el-form-item>
-        <el-form-item label="销售区域" prop="area">
-          <el-input v-model="form.area" placeholder="请输入销售区域" />
-        </el-form-item>
-        <el-form-item label="销售组织" prop="organization">
-          <el-input v-model="form.organization" placeholder="请输入销售组织" />
-        </el-form-item>
-        <el-form-item label="最佳拜访地点" prop="visitPlace">
-          <el-input v-model="form.visitPlace" placeholder="请输入最佳拜访地点" />
-        </el-form-item>
-        <el-form-item label="最佳拜访时间" prop="visitTime">
-          <el-date-picker clearable
-            v-model="form.visitTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择最佳拜访时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="家庭地址" prop="address">
-          <el-input v-model="form.address" placeholder="请输入家庭地址" />
-        </el-form-item>
-        <el-form-item label="邮件" prop="mail">
-          <el-input v-model="form.mail" placeholder="请输入邮件" />
-        </el-form-item>
-        <el-form-item label="联系电话" prop="telephone">
-          <el-input v-model="form.telephone" placeholder="请输入联系电话" />
-        </el-form-item>
-        <el-form-item label="关键决策人" prop="decisionMaker">
-          <el-input v-model="form.decisionMaker" placeholder="请输入关键决策人" />
-        </el-form-item>
-        <el-form-item label="擅长领域" prop="fieldExpertise">
-          <el-input v-model="form.fieldExpertise" placeholder="请输入擅长领域" />
-        </el-form-item>
-        <el-form-item label="支持度" prop="support">
-          <el-input v-model="form.support" placeholder="请输入支持度" />
-        </el-form-item>
-        <el-form-item label="决策力" prop="power">
-          <el-input v-model="form.power" placeholder="请输入决策力" />
-        </el-form-item>
-        <el-form-item label="职称" prop="jobTitle">
-          <el-input v-model="form.jobTitle" placeholder="请输入职称" />
-        </el-form-item>
-        <el-form-item label="职务" prop="position">
-          <el-input v-model="form.position" placeholder="请输入职务" />
-        </el-form-item>
-        <el-form-item label="任职科室" prop="section">
-          <el-input v-model="form.section" placeholder="请输入任职科室" />
-        </el-form-item>
-        <el-form-item label="上级联系人" prop="superiorContact">
-          <el-input v-model="form.superiorContact" placeholder="请输入上级联系人" />
-        </el-form-item>
-        <el-form-item label="状态" prop="state">
-          <el-input v-model="form.state" placeholder="请输入状态" />
-        </el-form-item>
-        <el-form-item label="业务爱好" prop="hobby">
-          <el-input v-model="form.hobby" placeholder="请输入业务爱好" />
-        </el-form-item>
-        <el-form-item label="籍贯" prop="birthplace">
-          <el-input v-model="form.birthplace" placeholder="请输入籍贯" />
-        </el-form-item>
-        <el-form-item label="生日" prop="birthday">
-          <el-date-picker clearable
-            v-model="form.birthday"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择生日">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="联系人分类" prop="contactClassification">
-          <el-input v-model="form.contactClassification" placeholder="请输入联系人分类" />
-        </el-form-item>
-        <el-form-item label="所属客户名称" prop="customerName">
-          <el-input v-model="form.customerName" placeholder="请输入所属客户名称" />
-        </el-form-item>
-        <el-form-item label="所属客户编码" prop="customerCode">
-          <el-input v-model="form.customerCode" placeholder="请输入所属客户编码" />
-        </el-form-item>
-        <el-form-item label="性别" prop="gander">
-          <el-input v-model="form.gander" placeholder="请输入性别" />
-        </el-form-item>
-        <el-form-item label="姓名" prop="name">
-          <el-input v-model="form.name" placeholder="请输入姓名" />
-        </el-form-item>
-        <el-form-item label="编号" prop="code">
-          <el-input v-model="form.code" placeholder="请输入编号" />
-        </el-form-item>
+        <el-divider content-position="left">基本信息</el-divider>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="商机id" prop="boId" v-if="source == 'Contact'">
+              <el-input v-model="form.boId" placeholder="请输入商机id" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="编码" prop="code">
+              <el-input v-model="form.code" placeholder="系统自动生成编码" :disabled = "true"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="姓名" prop="name">
+              <el-input v-model="form.name" placeholder="请输入姓名" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="性别" prop="gander">
+              <el-select v-model="form.gander" placeholder="请输入性别">
+                <el-option
+                  v-for="dict in dict.type.sys_user_sex"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="所属客户" prop="customerName">
+              <el-input v-model="form.customerName" placeholder="请输入所属客户" :disabled="this.source == 'BoDetails'">
+                <el-button slot="append" icon="el-icon-more" @click="refereCustomer" :disabled="this.source == 'BoDetails'"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="联系人分类" prop="contactClassification">
+              <el-select v-model="form.contactClassification" placeholder="请输入联系人分类">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_contact_type"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="生日" prop="birthday">
+              <el-date-picker clearable
+                v-model="form.birthday"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="请选择生日">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="籍贯" prop="birthplace">
+              <el-input v-model="form.birthplace" placeholder="请输入籍贯" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="兴趣爱好" prop="hobby">
+              <el-input v-model="form.hobby" placeholder="请输入业务爱好" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="状态" prop="state">
+              <el-select v-model="form.state" placeholder="请输入状态">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_contact_state"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-divider content-position="left">工作信息</el-divider>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="上级联系人" prop="superiorContact">
+              <el-input v-model="form.superiorContact" placeholder="请输入上级联系人" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="任职科室" prop="section">
+              <el-select v-model="form.section" placeholder="请输入任职科室">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_section"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="职务" prop="position">
+              <el-select v-model="form.position" placeholder="请输入职务">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_position"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="职称" prop="jobTitle">
+              <el-select v-model="form.jobTitle" placeholder="请输入职称">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_job_title"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="决策力" prop="power">
+              <el-select v-model="form.power" placeholder="请输入决策力">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_power"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="支持度" prop="support">
+              <el-select v-model="form.support" placeholder="请输入支持度">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_support"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="擅长领域" prop="fieldExpertise">
+              <el-select v-model="form.fieldExpertise" placeholder="请输入擅长领域">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_field_expertise"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="关键决策人" prop="decisionMaker">
+              <el-select v-model="form.decisionMaker" placeholder="请输入关键决策人">
+                <el-option
+                  v-for="dict in dict.type.sys_yes_no"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+          </el-col>
+        </el-row>
+        <el-divider content-position="left">联系信息</el-divider>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="联系电话" prop="telephone">
+              <el-input v-model="form.telephone" placeholder="请输入联系电话" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="邮件" prop="mail">
+              <el-input v-model="form.mail" placeholder="请输入邮件" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="家庭地址" prop="address">
+              <el-input v-model="form.address" placeholder="请输入家庭地址" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="最佳拜访时间" prop="visitTime">
+              <el-input v-model="form.visitTime" placeholder="请选择最佳拜访时间" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="最佳拜访地点" prop="visitPlace">
+              <el-input v-model="form.visitPlace" placeholder="请输入最佳拜访地点" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+          </el-col>
+        </el-row>
+        <el-tabs v-model="activeName" @tab-click="handleClick" v-if="this.operatingState != 'Insert'">
+          <el-tab-pane label="学历信息" name="first">
+            <EducationList  :key="timer" :source="'ContactList'" :supForm="this.form" />
+          </el-tab-pane>
+          <el-tab-pane label="社会关系" name="second">
+            <RelationshipList :key="timer" :source="'ContactList'" :supForm="this.form" />
+          </el-tab-pane>
+        </el-tabs>
+        <div class="md-auditInfo">
+          <el-divider content-position="left">其它信息</el-divider>
+          <el-form :inline="true" label-position="right" :model="form">
+            <el-form-item label="创建人">
+              <el-input v-model="form.departmentName" size="small" readonly></el-input>
+            </el-form-item>
+            <el-form-item label="创建时间">
+              <el-input v-model="form.departmentName" size="small" readonly></el-input>
+            </el-form-item>
+            <el-form-item label="修改人">
+              <el-input v-model="form.departmentName" size="small" readonly></el-input>
+            </el-form-item>
+            <el-form-item label="修改时间">
+              <el-input v-model="form.departmentName" size="small" readonly></el-input>
+            </el-form-item>
+          </el-form>
+        </div>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+    <!-- 客户参照 -->
+    <CustomerRef
+      ref="customerSelect"
+      @doSubmit="customerSelectionsToInput"
+      :single="true"
+    />
   </div>
 </template>
 
 <script>
 import { listContact, getContact, delContact, addContact, updateContact } from "@/api/business/spd/bo/contact";
+import CustomerRef from '@/views/business/spd/bo/refer/customer/index.vue';
+import EducationList from '../education/educationList.vue';
+import RelationshipList from '../relationship/relationshipList.vue';
 
 export default {
   name: "contactList",
-  props:["boId"],
+  props:["source","bo"],
+  dicts: ['sys_user_sex','mk_bo_contact_state','mk_bo_section','mk_bo_position','mk_bo_job_title','mk_bo_power','mk_bo_support','mk_bo_field_expertise','sys_yes_no','mk_bo_contact_type'],
+  components: {CustomerRef,EducationList,RelationshipList},
   data() {
     return {
       // 遮罩层
@@ -262,32 +422,6 @@ export default {
         pageNum: 1,
         pageSize: 10,
         boId: null,
-        createDate: null,
-        departmentName: null,
-        departmentCode: null,
-        area: null,
-        organization: null,
-        visitPlace: null,
-        visitTime: null,
-        address: null,
-        mail: null,
-        telephone: null,
-        decisionMaker: null,
-        fieldExpertise: null,
-        support: null,
-        power: null,
-        jobTitle: null,
-        position: null,
-        section: null,
-        superiorContact: null,
-        state: null,
-        hobby: null,
-        birthplace: null,
-        birthday: null,
-        contactClassification: null,
-        customerName: null,
-        customerCode: null,
-        gander: null,
         name: null,
         code: null,
       },
@@ -295,49 +429,62 @@ export default {
       form: {},
       // 表单校验
       rules: {
-        area: [
-          { required: true, message: "销售区域不能为空", trigger: "blur" }
-        ],
-        organization: [
-          { required: true, message: "销售组织不能为空", trigger: "blur" }
-        ],
-        address: [
-          { required: true, message: "家庭地址不能为空", trigger: "blur" }
+        name: [
+          { required: true, message: "姓名不能为空", trigger: "blur" }
         ],
-        telephone: [
-          { required: true, message: "联系电话不能为空", trigger: "blur" }
+        gander: [
+          { required: true, message: "性别不能为空", trigger: "blur" }
         ],
-        decisionMaker: [
-          { required: true, message: "关键决策人不能为空", trigger: "blur" }
+        customerName: [
+          { required: true, message: "所属客户名称不能为空", trigger: "blur" }
         ],
-        power: [
-          { required: true, message: "决策力不能为空", trigger: "blur" }
+        state: [
+          { required: true, message: "状态不能为空", trigger: "blur" }
         ],
-        jobTitle: [
-          { required: true, message: "职称不能为空", trigger: "blur" }
+        section: [
+          { required: true, message: "任职科室不能为空", trigger: "blur" }
         ],
         position: [
           { required: true, message: "职务不能为空", trigger: "blur" }
         ],
-        section: [
-          { required: true, message: "任职科室不能为空", trigger: "blur" }
-        ],
-        customerName: [
-          { required: true, message: "所属客户名称不能为空", trigger: "blur" }
+        jobTitle: [
+          { required: true, message: "职称不能为空", trigger: "blur" }
         ],
-        gander: [
-          { required: true, message: "性别不能为空", trigger: "blur" }
+        power: [
+          { required: true, message: "决策力不能为空", trigger: "blur" }
         ],
-        name: [
-          { required: true, message: "姓名不能为空", trigger: "blur" }
+        decisionMaker: [
+          { required: true, message: "关键决策人不能为空", trigger: "blur" }
         ],
-        code: [
-          { required: true, message: "编号不能为空", trigger: "blur" }
+        telephone: [
+          { required: true, message: "联系电话不能为空", trigger: "blur" },
+          {
+            validator: function(rule, value, callback) {
+              if (/^1[34578]\d{9}$/.test(value) == false) {
+                callback(new Error("手机号格式错误"));
+              } else {
+                callback();
+              }
+            },
+            trigger: "blur"
+          }
         ],
-      }
+      },
+      //重新加载子组件参数
+      timer: '',
+      //当前操作状态
+      operatingState: '',
+      //
+      activeName: 'first',
     };
   },
   created() {
+    if(this.source == 'BoDetails'){
+      this.queryParams.boId = this.bo.id;
+    }
+    if(this.source == 'Contact'){
+      this.queryParams = this.bo;
+    }
     this.getList();
   },
   methods: {
@@ -413,18 +560,27 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
+      this.operatingState = "Insert";
       this.reset();
+      if(this.source == 'BoDetails'){
+        this.form.boId = this.bo.id;
+        this.form.customer = this.bo.customer;
+        this.form.customerName = this.bo.customerName;
+      }
+      this.form.state = '1';
       this.open = true;
       this.title = "添加联系人管理";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+      this.operatingState = "Update";
       this.reset();
       const id = row.id || this.ids
       getContact(id).then(response => {
         this.form = response.data;
         this.open = true;
         this.title = "修改联系人管理";
+        this.timer = new Date().getTime();
       });
     },
     /** 提交按钮 */
@@ -462,7 +618,16 @@ export default {
       this.download('system/contact/export', {
         ...this.queryParams
       }, `contact_${new Date().getTime()}.xlsx`)
-    }
+    },
+    // 触发客户参照列表
+    refereCustomer() {
+      this.$refs.customerSelect.init()
+    },
+    //客户参照列表选择后
+    customerSelectionsToInput (selections) {
+      this.form.customer = selections[0].id;
+      this.form.customerName = selections[0].name;
+    },
   }
 };
 </script>

+ 22 - 252
src/views/business/spd/bo/contact/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="创建日期" prop="createDate">
+      <!-- <el-form-item label="创建日期" prop="createDate">
         <el-date-picker clearable
           v-model="queryParams.createDate"
           type="date"
@@ -73,14 +73,6 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="联系电话" prop="telephone">
-        <el-input
-          v-model="queryParams.telephone"
-          placeholder="请输入联系电话"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
       <el-form-item label="关键决策人" prop="decisionMaker">
         <el-input
           v-model="queryParams.decisionMaker"
@@ -185,14 +177,6 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="所属客户名称" prop="customerName">
-        <el-input
-          v-model="queryParams.customerName"
-          placeholder="请输入所属客户名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
       <el-form-item label="所属客户编码" prop="customerCode">
         <el-input
           v-model="queryParams.customerCode"
@@ -208,7 +192,7 @@
           clearable
           @keyup.enter.native="handleQuery"
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="姓名" prop="name">
         <el-input
           v-model="queryParams.name"
@@ -217,10 +201,18 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="编号" prop="code">
+      <el-form-item label="联系电话" prop="telephone">
+        <el-input
+          v-model="queryParams.telephone"
+          placeholder="请输入联系电话"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="所属客户" prop="customerName">
         <el-input
-          v-model="queryParams.code"
-          placeholder="请输入编号"
+          v-model="queryParams.customerName"
+          placeholder="请输入所属客户"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -230,243 +222,17 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['system:contact:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:contact:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['system:contact:remove']"
-        >删除</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['system:contact:export']"
-        >导出</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="contactList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="商机id" align="center" prop="boId" />
-      <el-table-column label="创建日期" align="center" prop="createDate" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createDate, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="部门名称" align="center" prop="departmentName" />
-      <el-table-column label="部门编码" align="center" prop="departmentCode" />
-      <el-table-column label="销售区域" align="center" prop="area" />
-      <el-table-column label="销售组织" align="center" prop="organization" />
-      <el-table-column label="最佳拜访地点" align="center" prop="visitPlace" />
-      <el-table-column label="最佳拜访时间" align="center" prop="visitTime" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.visitTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="家庭地址" align="center" prop="address" />
-      <el-table-column label="邮件" align="center" prop="mail" />
-      <el-table-column label="联系电话" align="center" prop="telephone" />
-      <el-table-column label="关键决策人" align="center" prop="decisionMaker" />
-      <el-table-column label="擅长领域" align="center" prop="fieldExpertise" />
-      <el-table-column label="支持度" align="center" prop="support" />
-      <el-table-column label="决策力" align="center" prop="power" />
-      <el-table-column label="职称" align="center" prop="jobTitle" />
-      <el-table-column label="职务" align="center" prop="position" />
-      <el-table-column label="任职科室" align="center" prop="section" />
-      <el-table-column label="上级联系人" align="center" prop="superiorContact" />
-      <el-table-column label="状态" align="center" prop="state" />
-      <el-table-column label="业务爱好" align="center" prop="hobby" />
-      <el-table-column label="籍贯" align="center" prop="birthplace" />
-      <el-table-column label="生日" align="center" prop="birthday" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="联系人分类" align="center" prop="contactClassification" />
-      <el-table-column label="所属客户名称" align="center" prop="customerName" />
-      <el-table-column label="所属客户编码" align="center" prop="customerCode" />
-      <el-table-column label="性别" align="center" prop="gander" />
-      <el-table-column label="姓名" align="center" prop="name" />
-      <el-table-column label="编号" align="center" prop="code" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:contact:edit']"
-          >修改</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:contact:remove']"
-          >删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改联系人管理对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="商机id" prop="boId">
-          <el-input v-model="form.boId" placeholder="请输入商机id" />
-        </el-form-item>
-        <el-form-item label="创建日期" prop="createDate">
-          <el-date-picker clearable
-            v-model="form.createDate"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择创建日期">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="部门名称" prop="departmentName">
-          <el-input v-model="form.departmentName" placeholder="请输入部门名称" />
-        </el-form-item>
-        <el-form-item label="部门编码" prop="departmentCode">
-          <el-input v-model="form.departmentCode" placeholder="请输入部门编码" />
-        </el-form-item>
-        <el-form-item label="销售区域" prop="area">
-          <el-input v-model="form.area" placeholder="请输入销售区域" />
-        </el-form-item>
-        <el-form-item label="销售组织" prop="organization">
-          <el-input v-model="form.organization" placeholder="请输入销售组织" />
-        </el-form-item>
-        <el-form-item label="最佳拜访地点" prop="visitPlace">
-          <el-input v-model="form.visitPlace" placeholder="请输入最佳拜访地点" />
-        </el-form-item>
-        <el-form-item label="最佳拜访时间" prop="visitTime">
-          <el-date-picker clearable
-            v-model="form.visitTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择最佳拜访时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="家庭地址" prop="address">
-          <el-input v-model="form.address" placeholder="请输入家庭地址" />
-        </el-form-item>
-        <el-form-item label="邮件" prop="mail">
-          <el-input v-model="form.mail" placeholder="请输入邮件" />
-        </el-form-item>
-        <el-form-item label="联系电话" prop="telephone">
-          <el-input v-model="form.telephone" placeholder="请输入联系电话" />
-        </el-form-item>
-        <el-form-item label="关键决策人" prop="decisionMaker">
-          <el-input v-model="form.decisionMaker" placeholder="请输入关键决策人" />
-        </el-form-item>
-        <el-form-item label="擅长领域" prop="fieldExpertise">
-          <el-input v-model="form.fieldExpertise" placeholder="请输入擅长领域" />
-        </el-form-item>
-        <el-form-item label="支持度" prop="support">
-          <el-input v-model="form.support" placeholder="请输入支持度" />
-        </el-form-item>
-        <el-form-item label="决策力" prop="power">
-          <el-input v-model="form.power" placeholder="请输入决策力" />
-        </el-form-item>
-        <el-form-item label="职称" prop="jobTitle">
-          <el-input v-model="form.jobTitle" placeholder="请输入职称" />
-        </el-form-item>
-        <el-form-item label="职务" prop="position">
-          <el-input v-model="form.position" placeholder="请输入职务" />
-        </el-form-item>
-        <el-form-item label="任职科室" prop="section">
-          <el-input v-model="form.section" placeholder="请输入任职科室" />
-        </el-form-item>
-        <el-form-item label="上级联系人" prop="superiorContact">
-          <el-input v-model="form.superiorContact" placeholder="请输入上级联系人" />
-        </el-form-item>
-        <el-form-item label="状态" prop="state">
-          <el-input v-model="form.state" placeholder="请输入状态" />
-        </el-form-item>
-        <el-form-item label="业务爱好" prop="hobby">
-          <el-input v-model="form.hobby" placeholder="请输入业务爱好" />
-        </el-form-item>
-        <el-form-item label="籍贯" prop="birthplace">
-          <el-input v-model="form.birthplace" placeholder="请输入籍贯" />
-        </el-form-item>
-        <el-form-item label="生日" prop="birthday">
-          <el-date-picker clearable
-            v-model="form.birthday"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择生日">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="联系人分类" prop="contactClassification">
-          <el-input v-model="form.contactClassification" placeholder="请输入联系人分类" />
-        </el-form-item>
-        <el-form-item label="所属客户名称" prop="customerName">
-          <el-input v-model="form.customerName" placeholder="请输入所属客户名称" />
-        </el-form-item>
-        <el-form-item label="所属客户编码" prop="customerCode">
-          <el-input v-model="form.customerCode" placeholder="请输入所属客户编码" />
-        </el-form-item>
-        <el-form-item label="性别" prop="gander">
-          <el-input v-model="form.gander" placeholder="请输入性别" />
-        </el-form-item>
-        <el-form-item label="姓名" prop="name">
-          <el-input v-model="form.name" placeholder="请输入姓名" />
-        </el-form-item>
-        <el-form-item label="编号" prop="code">
-          <el-input v-model="form.code" placeholder="请输入编号" />
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
+    <ContactList :key="timer" :source = "'Contact'" :bo="this.queryParams" />
   </div>
 </template>
 
 <script>
 import { listContact, getContact, delContact, addContact, updateContact } from "@/api/business/spd/bo/contact";
+import ContactList from '../contact/contactList.vue'
 
 export default {
   name: "Contact",
+  components: {ContactList},
   data() {
     return {
       // 遮罩层
@@ -564,7 +330,9 @@ export default {
         code: [
           { required: true, message: "编号不能为空", trigger: "blur" }
         ],
-      }
+      },
+      //重新加载子组件参数
+      timer: '',
     };
   },
   created() {
@@ -627,8 +395,10 @@ export default {
     },
     /** 搜索按钮操作 */
     handleQuery() {
+      console.log('this.queryParams',this.queryParams);
       this.queryParams.pageNum = 1;
-      this.getList();
+      this.timer = new Date().getTime();
+      // this.getList();
     },
     /** 重置按钮操作 */
     resetQuery() {

+ 301 - 0
src/views/business/spd/bo/education/educationList.vue

@@ -0,0 +1,301 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="educationList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="入学日期" align="center" prop="enrollDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.enrollDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="毕业日期" align="center" prop="graduationDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.graduationDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="学校名称" align="center" prop="school" />
+      <el-table-column label="专业名称" align="center" prop="majorName" />
+      <el-table-column label="学历" align="center" prop="education" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.mk_bo_education" :value="scope.row.education"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改联系人学历信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <!-- <el-form-item label="联系人ID" prop="contactId">
+          <el-input v-model="form.contactId" placeholder="请输入联系人ID" />
+        </el-form-item> -->
+        <el-form-item label="入学日期" prop="enrollDate">
+          <el-date-picker clearable
+            v-model="form.enrollDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择入学日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="毕业日期" prop="graduationDate">
+          <el-date-picker clearable
+            v-model="form.graduationDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择毕业日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="学校名称" prop="school">
+          <el-input v-model="form.school" placeholder="请输入学校名称" />
+        </el-form-item>
+        <el-form-item label="专业名称" prop="majorName">
+          <el-input v-model="form.majorName" placeholder="请输入专业名称" />
+        </el-form-item>
+        <el-form-item label="学历" prop="education">
+          <el-select v-model="form.education" placeholder="请输入学历">
+            <el-option
+              v-for="dict in dict.type.mk_bo_education"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listEducation, getEducation, delEducation, addEducation, updateEducation }  from "@/api/business/spd/bo/education";
+
+export default {
+  name: "EducationList",
+  props:["source","supForm"],
+  dicts: ['mk_bo_education'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 联系人学历信息表格数据
+      educationList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contactId: null,
+        createDate: null,
+        graduationDate: null,
+        enrollDate: null,
+        majorName: null,
+        education: null,
+        school: null,
+        code: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        enrollDate: [
+          { required: true, message: "入学日期不能为空", trigger: "blur" }
+        ],
+        graduationDate: [
+          { required: true, message: "毕业日期不能为空", trigger: "blur" }
+        ],
+        school: [
+          { required: true, message: "学校名称不能为空", trigger: "blur" }
+        ],
+        education: [
+          { required: true, message: "学历不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    if(this.source == 'ContactList'){
+      this.queryParams.contactId = this.supForm.id;
+    }
+    this.getList();
+  },
+  methods: {
+    /** 查询联系人学历信息列表 */
+    getList() {
+      this.loading = true;
+      listEducation(this.queryParams).then(response => {
+        this.educationList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        contactId: null,
+        delFlag: null,
+        updateTime: null,
+        updateBy: null,
+        createDate: null,
+        createBy: null,
+        graduationDate: null,
+        enrollDate: null,
+        majorName: null,
+        education: null,
+        school: null,
+        code: null,
+        id: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.operatingState = "Insert";
+      this.reset();
+      if(this.source == 'ContactList'){
+        this.form.contactId = this.supForm.id;
+      }
+      this.open = true;
+      this.title = "添加联系人学历信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEducation(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改联系人学历信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateEducation(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addEducation(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除联系人学历信息编号为"' + ids + '"的数据项?').then(function() {
+        return delEducation(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/education/export', {
+        ...this.queryParams
+      }, `education_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 61 - 18
src/views/business/spd/bo/pojpsn/pojpsnList.vue

@@ -8,7 +8,6 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['system:pojpsn:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -19,7 +18,6 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['system:pojpsn:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -30,7 +28,6 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['system:pojpsn:remove']"
         >删除</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@@ -46,31 +43,29 @@
           <dict-tag :options="dict.type.mk_bo_pojpsn_post" :value="scope.row.post"/>
         </template>
       </el-table-column>
-      <el-table-column label="责" align="center" prop="job" >
+      <el-table-column label="责" align="center" prop="job" >
         <template slot-scope="scope">
           <dict-tag :options="dict.type.mk_bo_pojpsn_job" :value="scope.row.job"/>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:pojpsn:edit']"
           >修改</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['system:pojpsn:remove']"
           >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -100,8 +95,8 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="责" prop="job">
-          <el-select v-model="form.job" placeholder="请选择责">
+        <el-form-item label="责" prop="job">
+          <el-select v-model="form.job" placeholder="请选择责">
             <el-option
               v-for="dict in dict.type.mk_bo_pojpsn_job"
               :key="dict.value"
@@ -109,6 +104,14 @@
               :value="dict.value"
             ></el-option>
           </el-select>
+          <!-- <el-select v-model="form.jobs" multiple placeholder="请选择职责">
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select> -->
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -168,17 +171,55 @@ export default {
       form: {},
       // 表单校验
       rules: {
+        staffName: [
+          { required: true, message: "员工不能为空", trigger: "blur" }
+        ],
+        post: [
+          { required: true, message: "岗位不能为空", trigger: "blur" }
+        ],
+        job: [
+          { required: true, message: "职责不能为空", trigger: "blur" }
+        ],
       },
+      //
+      jobs : [],
+      options: [{
+          value: '0',
+          label: '上传商机审会议'
+        }, {
+          value: '1',
+          label: '售前提案'
+        }, {
+          value: '2',
+          label: '调研报告'
+        }, {
+          value: '3',
+          label: '考察报告'
+        }, {
+          value: '4',
+          label: '投标书'
+        },],
     };
   },
   created() {
-    this.queryParams.bo = this.bo.bo;
-    this.queryParams.boName = this.bo.boName;
-    this.queryParams.staffName = this.bo.staffName;
-    this.queryParams.post = this.bo.post;
-    this.queryParams.job = this.bo.job;
+    if(this.source == 'Pojpsn'){
+      this.queryParams = this.bo;
+    }
+    if(this.source == 'BoDetails'){
+      this.queryParams.bo = this.bo.id;
+    }
     this.getList();
   },
+  watch: {
+    //阶段
+    "jobs": {
+      handler(newName, oldName) {
+        this.form.job = newName.toString();
+        console.log(value1,value2);
+      },
+      immediate: true,
+    },
+  },
   methods: {
     /** 查询项目成员列表 */
     getList() {
@@ -233,9 +274,11 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      if(this.source == 'BoDetails'){
+        this.form.bo = this.bo.id;
+        this.form.boName = this.bo.boName;
+      }
       this.open = true;
-      this.form.bo = this.queryParams.bo;
-      this.form.boName = this.queryParams.boName;
       this.title = "添加项目成员";
     },
     /** 修改按钮操作 */
@@ -296,4 +339,4 @@ export default {
     }
   }
 };
-</script>
+</script>

+ 248 - 0
src/views/business/spd/bo/refer/contact/index.vue

@@ -0,0 +1,248 @@
+<template>
+  <div>
+    <el-dialog
+      title="联系人选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="getList()"
+              @submit.native.prevent
+            >
+              <el-form-item prop="customerName">
+                <el-input
+                  size="small"
+                  v-model="queryParams.customerName"
+                  placeholder="客户名称"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item prop="name">
+                <el-input
+                  size="small"
+                  v-model="queryParams.name"
+                  placeholder="联系人"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="getList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="customerName"
+                header-align="center"
+                align="left"
+                sortable="custom"
+                min-width="90"
+                label="客户名称"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="left"
+                sortable="custom"
+                min-width="90"
+                label="联系人"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="queryParams.pageNum"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="queryParams.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listContact} from "@/api/business/spd/bo/contact";
+export default {
+  data() {
+    return {
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        customerName: undefined,
+      },
+      searchForm: {
+        name: '',
+        customerName: ''
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      pageNo: 1,
+      pageSize: 10,
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    },
+    //外部查询参数
+    outerQueryParams:{
+      type: Object,
+      default: null
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    getList() {
+      this.loading = true;
+      this.queryParams.customer = this.outerQueryParams.customer;
+      listContact(this.addDateRange(this.queryParams)).then(response => {
+          this.dataList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.queryParams.pageSize = val;
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.queryParams.pageNum = val;
+      this.getList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs.searchForm.resetFields();
+      this.getList();
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 4 - 3
src/views/business/spd/bo/refer/customer/index.vue

@@ -23,7 +23,7 @@
               <el-form-item prop="code">
                 <el-input
                   size="small"
-                  v-model="queryParams.userName"
+                  v-model="queryParams.code"
                   placeholder="客户编码"
                   clearable
                 ></el-input>
@@ -31,7 +31,7 @@
               <el-form-item prop="name">
                 <el-input
                   size="small"
-                  v-model="queryParams.nickName"
+                  v-model="queryParams.name"
                   placeholder="客户名称"
                   clearable
                 ></el-input>
@@ -192,7 +192,8 @@ export default {
     },
     // 排序
     resetSearch() {
-      this.$refs.searchForm.resetFields();
+      // this.$refs.searchForm.resetFields();
+      this.resetForm("searchForm");
       this.getList();
     },
     // 选中数据

+ 242 - 0
src/views/business/spd/bo/refer/saleaea/index.vue

@@ -0,0 +1,242 @@
+<template>
+  <div>
+    <el-dialog
+      title="销售区域选择"
+      width="1000px"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      v-dialogDrag
+      class="userDialog"
+      :visible.sync="visible"
+    >
+      <el-container style="height: 500px">
+        <el-container>
+          <el-header style="text-align: left; font-size: 12px; height: 30px">
+            <el-form
+              size="small"
+              :inline="true"
+              ref="searchForm"
+              :model="searchForm"
+              @keyup.enter.native="getList()"
+              @submit.native.prevent
+            >
+              <el-form-item prop="code">
+                <el-input
+                  size="small"
+                  v-model="queryParams.code"
+                  placeholder="区域编码"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item prop="name">
+                <el-input
+                  size="small"
+                  v-model="queryParams.name"
+                  placeholder="区域名称"
+                  clearable
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click="getList()"
+                  size="small"
+                  icon="el-icon-search"
+                  >查询</el-button
+                >
+                <el-button
+                  @click="resetSearch()"
+                  size="small"
+                  icon="el-icon-refresh-right"
+                >重置</el-button>
+              </el-form-item>
+            </el-form>
+          </el-header>
+          <el-main>
+            <el-table
+              :data="dataList"
+              v-loading="loading"
+              size="small"
+              border
+              ref="contractTable"
+              @select="handleSelectionChange"
+              height="calc(100% - 40px)"
+              style="width: 100%"
+            >
+              <el-table-column
+                type="selection"
+                header-align="center"
+                align="center"
+                width="50"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="code"
+                header-align="center"
+                align="left"
+                sortable="custom"
+                min-width="90"
+                label="区域编码"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="name"
+                header-align="center"
+                align="left"
+                sortable="custom"
+                min-width="90"
+                label="区域名称"
+              >
+              </el-table-column>
+            </el-table>
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="queryParams.pageNum"
+              :page-sizes="[5, 10, 15, 20]"
+              :page-size="queryParams.pageSize"
+              :total="total"
+              layout="total, sizes, prev, pager, next, jumper"
+            >
+            </el-pagination>
+          </el-main>
+        </el-container>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          size="small"
+          @click="visible = false"
+          icon="el-icon-circle-close"
+          >关闭</el-button
+        >
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-circle-check"
+          @click="doSubmit()"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listSaleArea } from "@/api/business/spd/bo/iuapquery/basic";
+export default {
+  data() {
+    return {
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        name: undefined,
+      },
+      searchForm: {
+        code: '',
+        name: ''
+      },
+      dataListAllSelections: [], // 所有选中的数据包含跨页数据
+      idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+      dataList: [],
+      pageNo: 1,
+      pageSize: 10,
+      total: 0,
+      orders: [],
+      loading: false,
+      visible: false,
+    };
+  },
+  props: {
+    selectData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否启用单选
+    single: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    init() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData));
+        this.resetSearch();
+      });
+    },
+    // 获取数据列表
+    getList() {
+      this.loading = true;
+      listSaleArea(this.addDateRange(this.queryParams)).then(response => {
+          this.dataList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.queryParams.pageSize = val;
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.queryParams.pageNum = val;
+      this.getList();
+    },
+    // 排序
+    resetSearch() {
+      this.$refs.searchForm.resetFields();
+      this.getList();
+    },
+    // 选中数据
+    handleSelectionChange(selection, row) {
+      if (this.single && selection.length > 1) {
+        this.$refs.contractTable.clearSelection();
+        this.$refs.contractTable.toggleRowSelection(row);
+      }
+      this.dataListAllSelections = this.single ? [row] : selection
+    },
+    // 设置选中的方法
+    setSelectRow() {
+      this.$refs.contractTable.clearSelection();
+      if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+        return;
+      }
+      for (let i = 0; i < this.dataList.length; i++) {
+        if (this.dataListAllSelections.some(item => item[this.idKey] == this.dataList[i][this.idKey])) {
+          // 设置选中,记住table组件需要使用ref="table"
+          this.$refs.contractTable.toggleRowSelection(this.dataList[i], true);
+        }
+      }
+    },
+    doSubmit() {
+      this.visible = false;
+      console.log('选择的数据?',this.dataListAllSelections)
+      this.$emit("doSubmit", this.dataListAllSelections);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.userDialog {
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination {
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 305 - 0
src/views/business/spd/bo/relationship/relationshipList.vue

@@ -0,0 +1,305 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="relationshipList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="关系类型" align="center" prop="relationship" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.mk_bo_relationship" :value="scope.row.relationship"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="姓名" align="center" prop="name" />
+      <el-table-column label="电话" align="center" prop="telephone" />
+      <el-table-column label="出生日期" align="center" prop="enrollDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.enrollDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="就读学校" align="center" prop="school" />
+      <el-table-column label="工作单位" align="center" prop="company" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改联系人社会关系对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <!-- <el-form-item label="联系人ID" prop="contactId">
+          <el-input v-model="form.contactId" placeholder="请输入联系人ID" />
+        </el-form-item> -->
+        <el-form-item label="关系类型" prop="relationship">
+          <el-select v-model="form.relationship" placeholder="请输入关系类型">
+            <el-option
+              v-for="dict in dict.type.mk_bo_relationship"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="姓名" prop="name">
+          <el-input v-model="form.name" placeholder="请输入姓名" />
+        </el-form-item>
+        <el-form-item label="电话" prop="telephone">
+          <el-input v-model="form.telephone" placeholder="请输入电话" />
+        </el-form-item>
+        <el-form-item label="出生日期" prop="enrollDate">
+          <el-date-picker clearable
+            v-model="form.enrollDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择出生日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="就读学校" prop="school">
+          <el-input v-model="form.school" placeholder="请输入就读学校" />
+        </el-form-item>
+        <el-form-item label="工作单位" prop="company">
+          <el-input v-model="form.company" placeholder="请输入工作单位" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listRelationship, getRelationship, delRelationship, addRelationship, updateRelationship } from "@/api/business/spd/bo/relationship";
+
+export default {
+  name: "RelationshipList",
+  props:["source","supForm"],
+  dicts: ['mk_bo_relationship'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 联系人社会关系表格数据
+      relationshipList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        contactId: null,
+        company: null,
+        school: null,
+        enrollDate: null,
+        telephone: null,
+        name: null,
+        relationship: null,
+        code: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        relationship: [
+          { required: true, message: "关系类型不能为空", trigger: "blur" }
+        ],
+        name: [
+          { required: true, message: "姓名不能为空", trigger: "blur" }
+        ],
+        telephone: [
+          { required: true, message: "电话不能为空", trigger: "blur" },
+          {
+            validator: function(rule, value, callback) {
+              if (/^1[34578]\d{9}$/.test(value) == false) {
+                callback(new Error("手机号格式错误"));
+              } else {
+                callback();
+              }
+            },
+            trigger: "blur"
+          }
+        ],
+      }
+    };
+  },
+  created() {
+    if(this.source == 'ContactList'){
+      this.queryParams.contactId = this.supForm.id;
+    }
+    this.getList();
+  },
+  methods: {
+    /** 查询联系人社会关系列表 */
+    getList() {
+      this.loading = true;
+      listRelationship(this.queryParams).then(response => {
+        this.relationshipList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        contactId: null,
+        delFlag: null,
+        updateTime: null,
+        updateBy: null,
+        createTime: null,
+        createBy: null,
+        company: null,
+        school: null,
+        enrollDate: null,
+        telephone: null,
+        name: null,
+        relationship: null,
+        code: null,
+        id: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.operatingState = "Insert";
+      this.reset();
+      if(this.source == 'ContactList'){
+        console.log('this.form.contactId',this.form.contactId);
+        this.form.contactId = this.supForm.id;
+      }
+      this.open = true;
+      this.title = "添加联系人社会关系";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getRelationship(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改联系人社会关系";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateRelationship(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addRelationship(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除联系人社会关系编号为"' + ids + '"的数据项?').then(function() {
+        return delRelationship(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/relationship/export', {
+        ...this.queryParams
+      }, `relationship_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 3 - 42
src/views/business/spd/bo/task/index.vue

@@ -49,46 +49,6 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="联系人名称" prop="linkmanName">
-        <el-input
-          v-model="queryParams.linkmanName"
-          placeholder="请输入联系人名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="销售组织名称" prop="salesOrgName">
-        <el-input
-          v-model="queryParams.salesOrgName"
-          placeholder="请输入销售组织名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="部门名称" prop="deptName">
-        <el-input
-          v-model="queryParams.deptName"
-          placeholder="请输入部门名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="负责人名称" prop="staffName">
-        <el-input
-          v-model="queryParams.staffName"
-          placeholder="请输入负责人名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="截止时间" prop="deadlineDate">
-        <el-date-picker clearable
-          v-model="queryParams.deadlineDate"
-          type="date"
-          value-format="yyyy-MM-dd"
-          placeholder="请选择截止时间">
-        </el-date-picker>
-      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -151,7 +111,8 @@ export default {
         deptName: null,
         staff: null,
         staffName: null,
-        deadlineDate: null,
+        startTime: null,
+        deadlineTime: null,
         content: null,
         tenantId: null,
         revision: null,
@@ -202,7 +163,7 @@ export default {
         deptName: null,
         staff: null,
         staffName: null,
-        deadlineDate: null,
+        deadlineTime: null,
         content: null,
         tenantId: null,
         revision: null,

+ 168 - 47
src/views/business/spd/bo/task/taskList.vue

@@ -8,7 +8,6 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['drp-business:task:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -19,7 +18,6 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['drp-business:task:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -30,17 +28,21 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['drp-business:task:remove']"
         >删除</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange">
+    <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange" >
       <el-table-column type="selection" width="55" align="center" />
-      <!-- <el-table-column label="主键" align="center" prop="id" /> -->
-      <el-table-column label="商机id" align="center" prop="bo" />
-      <el-table-column label="商机阶段" align="center" prop="boStage" />
+      <!-- <el-table-column label="商机id" align="center" prop="bo" v-if="source == 'Task'"/> -->
+      <el-table-column label="商机名称" align="center" prop="boName" v-if="source == 'Task'"/>
+      <el-table-column label="商机阶段" align="center" prop="boStage">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.mk_bo_stage" :value="scope.row.boStage"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="客户名称" align="center" prop="customerName" v-if="source == 'Task'"/>
       <el-table-column label="任务编码" align="center" prop="code" />
       <el-table-column label="任务名称" align="center" prop="name" />
       <el-table-column label="任务类型" align="center" prop="type" >
@@ -53,37 +55,34 @@
           <dict-tag :options="dict.type.mk_bo_taskstate" :value="scope.row.state"/>
         </template>
       </el-table-column>
-      <el-table-column label="客户名称" align="center" prop="customerName" />
       <el-table-column label="联系人" align="center" prop="linkmanName" />
       <el-table-column label="销售组织名称" align="center" prop="salesOrgName" />
       <el-table-column label="部门名称" align="center" prop="deptName" />
       <el-table-column label="负责人名称" align="center" prop="staffName" />
-      <el-table-column label="截止时间" align="center" prop="deadlineDate" width="180">
+      <el-table-column label="截止时间" align="center" prop="deadlineTime" width="180">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.deadlineDate, '{y}-{m}-{d}') }}</span>
+          <span>{{ parseTime(scope.row.deadlineTime, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
       <el-table-column label="任务内容" align="center" prop="content" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['drp-business:task:edit']"
           >修改</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['drp-business:task:remove']"
           >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -98,18 +97,25 @@
         <el-row>
           <el-col :span="8">
             <el-form-item label="商机名称" prop="boName">
-              <el-input v-model="form.boName" placeholder="请输入商机名称" />
+              <el-input v-model="form.boName" placeholder="请输入商机名称"  :disabled="this.source == 'BoDetails'"/>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="商机阶段" prop="boStage">
-              <el-input v-model="form.boStage" placeholder="请输入商机阶段" />
+            <el-form-item label="商机阶段" prop="boStage" v-if="source == 'Task'">
+              <el-select v-model="form.boStage" placeholder="请输入商机阶段">
+                <el-option
+                  v-for="dict in dict.type.mk_bo_stage"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="客户" prop="customerName">
-              <el-input v-model="form.customerName" placeholder="请输入客户" >
-                <el-button slot="append" icon="el-icon-more" @click="refereCustomer"></el-button>
+              <el-input v-model="form.customerName" placeholder="请输入客户" :disabled="this.source == 'BoDetails'">
+                <el-button slot="append" icon="el-icon-more" @click="refereCustomer" :disabled="this.source == 'BoDetails'"></el-button>
               </el-input>
             </el-form-item>
           </el-col>
@@ -118,7 +124,7 @@
         <el-row>
           <el-col :span="8">
             <el-form-item label="任务编码" prop="code">
-              <el-input v-model="form.code" placeholder="请输入任务编码" />
+              <el-input v-model="form.code" placeholder="系统自动生成编码" :disabled="true"/>
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -127,7 +133,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="任务状态">
+            <el-form-item label="任务状态" prop="state">
               <el-select v-model="form.state" placeholder="请输入任务状态">
                 <el-option
                   v-for="dict in dict.type.mk_bo_taskstate"
@@ -141,16 +147,19 @@
         </el-row>
         <el-row>
           <el-col :span="8">
-            <el-form-item label="联系人" prop="linkman">
-              <el-input v-model="form.linkman" placeholder="请输入联系人" />
+            <el-form-item label="开始时间" prop="startTime">
+              <el-date-picker clearable
+                v-model="form.startTime"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="请选开始时间">
+              </el-date-picker>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="截止时间" prop="deadlineDate">
+            <el-form-item label="截止时间" prop="deadlineTime">
               <el-date-picker clearable
-                v-model="form.deadlineDate"
+                v-model="form.deadlineTime"
                 type="date"
                 value-format="yyyy-MM-dd"
                 placeholder="请选择截止时间">
@@ -158,7 +167,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="任务类型">
+            <el-form-item label="任务类型" prop="type">
               <el-select v-model="form.type" placeholder="请选择任务类型">
                 <el-option
                   v-for="dict in dict.type.mk_bo_tasktype"
@@ -172,30 +181,73 @@
         </el-row>
         <el-row>
           <el-col :span="8">
+            <el-form-item label="联系人" prop="linkmanName">
+              <el-input v-model="form.linkmanName" >
+                <el-button slot="append" icon="el-icon-more" @click="refereContact"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
             <el-form-item label="销售组织" prop="salesOrgName">
-              <el-input v-model="form.salesOrgName">
-                <el-button slot="append" icon="el-icon-more" @click="refereOrg"></el-button>
+              <el-input v-model="form.salesOrgName" :disabled="true">
+                <el-button slot="append" icon="el-icon-more" @click="refereOrg" :disabled="true"></el-button>
               </el-input>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="部门" prop="deptName">
-              <el-input v-model="form.deptName">
-                <el-button slot="append" icon="el-icon-more" @click="refereDept"></el-button>
+              <el-input v-model="form.deptName" :disabled="true">
+                <el-button slot="append" icon="el-icon-more" @click="refereDept" :disabled="true"></el-button>
               </el-input>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="负责人" prop="staff">
+            <el-form-item label="负责人" prop="staffName">
               <el-input v-model="form.staffName">
                 <el-button slot="append" icon="el-icon-more" @click="refereStaff"></el-button>
               </el-input>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="任务内容">
-          <editor v-model="form.content" :min-height="192"/>
+        <el-form-item label="任务内容" prop="content">
+          <el-input
+            type="textarea"
+            :rows="2"
+            placeholder="请输入任务内容"
+            autosize
+            v-model="form.content">
+          </el-input>
         </el-form-item>
+        <BehaviorList  :key="timer" :source="'TaskList'" :bo="this.form" v-if="this.operatingState != 'Insert'"/>
+        <div class="md-auditInfo">
+          <el-divider content-position="left">其它信息</el-divider>
+          <el-form :inline="true" label-position="right" :model="form">
+            <el-row>
+              <el-col :span="6">
+                <el-form-item label="创建人">
+                  <el-input v-model="form.createBy" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="创建时间">
+                  <el-input v-model="form.createTime" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="修改人">
+                  <el-input v-model="form.updateBy" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="修改时间">
+                  <el-input v-model="form.updateTime" size="small" readonly></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -208,6 +260,13 @@
       @doSubmit="customerSelectionsToInput"
       :single="true"
     />
+    <!-- 联系人参照 -->
+    <ContactRef
+      ref="contactSelect"
+      @doSubmit="contactSelectionsToInput"
+      :single="true"
+      :outerQueryParams="this.bo"
+    />
     <!-- 组织参照 -->
     <OrgRef
       ref="orgSelect"
@@ -233,16 +292,18 @@
 import { listTask, getTask, delTask, addTask, updateTask } from "@/api/business/spd/bo/task";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import CustomerRef from '@/views/business/spd/bo/refer/customer/index.vue';
+import ContactRef from '@/views/business/spd/bo/refer/contact/index.vue';
 import OrgRef from '@/views/business/spd/bo/refer/org/index.vue';
 import DeptRef from '@/views/business/spd/bo/refer/dept/index.vue';
 import StaffRef from '@/views/business/spd/bo/refer/staff/index.vue';
+import BehaviorList from '../behavior/behaviorList.vue'
 
 
 export default {
   name: "TaskList",
   props:["source","bo"],
-  dicts: ['mk_bo_taskstate','mk_bo_tasktype'],
-  components: {CustomerRef,OrgRef,DeptRef,StaffRef},
+  dicts: ['mk_bo_taskstate','mk_bo_tasktype','mk_bo_stage'],
+  components: {CustomerRef,ContactRef,OrgRef,DeptRef,StaffRef,BehaviorList},
   data() {
     return {
       // 遮罩层
@@ -276,13 +337,15 @@ export default {
         customer: null,
         customerName: null,
         linkman: null,
+        linkmanName: null,
         salesOrg: null,
         salesOrgName: null,
         dept: null,
         deptName: null,
         staff: null,
         staffName: null,
-        deadlineDate: null,
+        startTime: null,
+        deadlineTime: null,
         content: null,
         tenantId: null,
         revision: null,
@@ -291,17 +354,47 @@ export default {
       form: {},
       // 表单校验
       rules: {
-      }
+        customerName: [
+          { required: true, message: "客户不能为空", trigger: "blur" }
+        ],
+        name: [
+          { required: true, message: "任务名称不能为空", trigger: "blur" }
+        ],
+        state: [
+          { required: true, message: "任务状态不能为空", trigger: "blur" }
+        ],
+        type: [
+          { required: true, message: "任务类型不能为空", trigger: "blur" }
+        ],
+        linkmanName: [
+          { required: true, message: "联系人不能为空", trigger: "blur" }
+        ],
+        staffName: [
+          { required: true, message: "负责人不能为空", trigger: "blur" }
+        ],
+        startTime: [
+          { required: true, message: "开始时间不能为空", trigger: "blur" }
+        ],
+        deadlineTime: [
+          { required: true, message: "截止时间不能为空", trigger: "blur" }
+        ],
+        content: [
+          { required: true, message: "任务内容不能为空", trigger: "blur" }
+        ],
+      },
+      //重新加载子组件参数
+      timer: '',
+      //当前操作状态
+      operatingState: '',
     };
   },
   created() {
-    //两种方式都可以用
-    console.log("this.props.boId",this.$props.boId,'this.boId',this.boId);
-    this.queryParams.bo = this.bo.bo;
-    // this.queryParams.boName = this.bo.boName;
-    // this.queryParams.staffName = this.bo.staffName;
-    // this.queryParams.post = this.bo.post;
-    // this.queryParams.job = this.bo.job;
+    if(this.source == 'BoDetails'){
+      this.queryParams.bo = this.bo.id;
+    }
+    if(this.source == 'Task'){
+      this.queryParams = this.bo;
+    }
     this.getList();
   },
   methods: {
@@ -332,13 +425,15 @@ export default {
         customer: null,
         customerName: null,
         linkman: null,
+        linkmanName: null,
         salesOrg: null,
         salesOrgName: null,
         dept: null,
         deptName: null,
         staff: null,
         staffName: null,
-        deadlineDate: null,
+        startTime: null,
+        deadlineTime: null,
         content: null,
         tenantId: null,
         revision: null,
@@ -368,18 +463,29 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
+      this.operatingState = "Insert";
       this.reset();
+      if(this.source == 'BoDetails'){
+        this.form.bo = this.bo.id;
+        this.form.boName = this.bo.boName;
+        this.form.boStage = this.bo.boStage;
+        this.form.customer = this.bo.customer;
+        this.form.customerName = this.bo.customerName;
+      }
+      this.form.state = '0';
       this.open = true;
       this.title = "添加任务";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+      this.operatingState = "Update";
       this.reset();
       const id = row.id || this.ids
       getTask(id).then(response => {
         this.form = response.data;
         this.open = true;
         this.title = "修改任务";
+        this.timer = new Date().getTime();
       });
     },
     /** 提交按钮 */
@@ -427,6 +533,17 @@ export default {
       this.form.customer = selections[0].id;
       this.form.customerName = selections[0].name;
     },
+    // 触发联系人参照列表
+    refereContact() {
+      this.$refs.contactSelect.init()
+    },
+    //联系人参照列表选择后
+    contactSelectionsToInput (selections) {
+      console.log('selections',selections);
+      this.form.linkman = selections[0].id;
+      this.form.linkmanName = selections[0].name;
+      console.log('this.form',this.form);
+    },
     // 触发组织参照列表
     refereOrg() {
       this.$refs.orgSelect.init()
@@ -453,6 +570,10 @@ export default {
     staffSelectionsToInput (selections) {
       this.form.staff = selections[0].userId;
       this.form.staffName = selections[0].nickName;
+      this.form.dept = selections[0].deptId;
+      this.form.deptName = selections[0].deptName;
+      this.form.salesOrg = selections[0].orgId;
+      this.form.salesOrgName = selections[0].orgName;
     }
   }
 };

+ 1 - 1
src/views/index.vue

@@ -55,7 +55,7 @@
       <el-col :sm="24" :lg="12" style="padding-left: 20px">
         <h2>德荣后台管理框架</h2>
         <p>
-          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了德荣供应链管理平台,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
+          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了德荣资源平台平台,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
         </p>
         <p>
           <b>当前版本:</b> <span>v{{ version }}</span>

+ 2 - 2
src/views/login.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="login">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">德荣供应链管理平台</h3>
+      <h3 class="title">德荣资源平台</h3>
       <el-form-item prop="username">
         <el-input
           v-model="loginForm.username"
@@ -73,7 +73,7 @@ export default {
       codeUrl: "",
       loginForm: {
         username: "drp",
-        password: "admin123",
+        password: "drp0330",
         rememberMe: false,
         code: "",
         uuid: ""

文件差异内容过多而无法显示
+ 338 - 151
src/views/material/basicFile/details.vue


+ 78 - 29
src/views/material/basicFile/index.vue

@@ -9,7 +9,7 @@
         <el-button-group>
           <!-- <el-button size="small" @click="handleInster">新增</el-button> -->
           <el-button size="small" @click="handleEdit">修改</el-button>
-          <el-button size="small" @click="handleDel">删除</el-button>
+          <!-- <el-button size="small" @click="handleDel">删除</el-button> -->
           <!-- <el-button size="small" @click="handleCopy">复制</el-button> -->
         </el-button-group>
       </el-col>
@@ -26,7 +26,7 @@
               <el-dropdown-item :command="filterCondition('stop')">显示停用</el-dropdown-item>
               <el-dropdown-item :command="filterCondition('allot')">显示已分配</el-dropdown-item>
             </el-dropdown-menu>
-                    </el-dropdown> -->
+                                                                                                                                    </el-dropdown> -->
 
           <!-- <el-button size="small" @click="handleQuery">查询</el-button> -->
           <el-button size="small" @click="handleRefresh">刷新</el-button>
@@ -45,27 +45,31 @@
             </el-dropdown-menu>
           </el-dropdown>
         </el-button-group>
-                </el-col> -->
+                                                                                                                                </el-col> -->
 
       <!-- 申请单查询 -->
     <!-- <el-col :span="1.5">
         <el-button-group>
           <el-button size="small" @click="handleQueryForm">申请单查询</el-button>
         </el-button-group>
-                </el-col> -->
+                                                                                                                                </el-col> -->
 
       <!-- 导入导出 -->
       <el-col :span="1.5">
         <el-button-group>
-          <el-button size="small" @click="handleImport">批量导入</el-button>
+          <el-button size="small" @click="handleImport" v-hasPermi="['system:material:import']">批量导入</el-button>
           <el-button size="small" @click="handleExport" v-hasPermi="['system:material:export']">批量导出</el-button>
         </el-button-group>
       </el-col>
+
+      <!-- 查询框 -->
       <el-col :span="1.5">
-        <!-- 查询框 -->
-        <el-form :inline="true" :model="queryForm" class="mb-query">
+        <el-form :inline="true" :model="queryForm" class="mb-query" @submit.native.prevent>
           <el-form-item label="物料名称">
-            <el-input size="small" v-model="queryForm.name" placeholder="物料名称"></el-input>
+            <el-input size="small" v-model="queryForm.name" placeholder="物料名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="物料编码">
+            <el-input size="small" v-model="queryForm.code" placeholder="物料编码" clearable></el-input>
           </el-form-item>
           <el-form-item>
             <el-button size="small" type="primary" @click="handleQuery">查询</el-button>
@@ -75,20 +79,22 @@
 
     </el-row>
 
-    <el-dialog title="操作提示" :visible.sync="optionDialog.show" width="30%" center>
-      <span>是否确认{{ optionDialog.op }}?</span>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="handleOptionShow('option', false)">取 消</el-button>
-        <el-button type="primary" @click="handleComfirmOption('cancal')">确 定</el-button>
-      </span>
-    </el-dialog>
-
+    <!-- 主体列表 -->
     <el-card class="material-list" v-loading="loading">
       <el-table :data="taskList" @cell-dblclick="handledbClick" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" />
+        <el-table-column type="selection" width="20" />
         <el-table-column type="index" label="序号" width="55" align="center" />
-        <el-table-column v-for="h in  tableHeader" v-if="h.show" :label="h.name" align="center" :prop="h.prop"
-          show-overflow-tooltip />
+        <el-table-column width="150" v-for="h in  tableHeader" v-if="h.show" :label="h.name" align="center"
+          show-overflow-tooltip>
+          <!-- :prop="h.attribute == 'select' ? `${h.prop}Name` : h.prop" -->
+          <template slot-scope="scope">
+            {{ h.attribute == 'select' ? scope.row[`${h.prop}Name`] :
+              (h.attribute == 'checkbox' ?
+                (scope.row[h.prop] == '0' ? '是' : '否')
+                : scope.row[h.prop])
+            }}
+          </template>
+        </el-table-column>
       </el-table>
 
       <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
@@ -97,17 +103,26 @@
       </el-pagination>
     </el-card>
 
+    <!-- 操作提示 -->
+    <el-dialog title="操作提示" :visible.sync="optionDialog.show" width="30%" center>
+      <span>是否确认{{ optionDialog.op }}?</span>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleOptionShow('option', false)">取 消</el-button>
+        <el-button type="primary" @click="handleComfirmOption('cancal')">确 定</el-button>
+      </span>
+    </el-dialog>
+
     <!-- 导入弹窗 -->
-    <el-dialog title="批量导入" :visible.sync="importData.show" width="50%" center @before-close="handlefileDialogColse">
+    <el-dialog title="批量导入" :visible.sync="importData.show" width="30%" center @before-close="handlefileDialogColse">
       <div class="mb-import">
 
         <el-upload class="upload-demo" accept=".xls, .xlsx" ref="upload" action="#" :on-remove="handleFileRemove"
           :file-list="importData.list" :auto-upload="false" :on-change="handleChangeFile" :limit="1">
-          <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
+          <el-button slot="trigger" type="primary">选取文件</el-button>
           <!-- <el-button style="margin-left: 10px;" size="small" type="success" @click="handleSubmitUpload">上传到服务器</el-button> -->
           <div slot="tip" class="el-upload__tip">只能上传Excel文件</div>
         </el-upload>
-
+        <el-button type="success" @click="handleDownTemplate">下载模板</el-button>
       </div>
       <span slot="footer">
         <el-button @click="handleImportData('cancal')">取 消</el-button>
@@ -131,6 +146,7 @@ export default {
       // 查询表单字段
       queryForm: {
         name: '',
+        code: ''
       },
       // 总条数
       total: 1,
@@ -164,12 +180,12 @@ export default {
     // 改变分页大小
     handleSizeChange(e) {
       this.queryParams.pageSize = e;
-      this.getMaterialList('material');
+      this.handleQuery();
     },
     // 改变当前页
     handleCurrentChange(e) {
       this.queryParams.pageNum = e;
-      this.getMaterialList('material');
+      this.handleQuery();
     },
     // 新增
     handleInster() {
@@ -225,7 +241,7 @@ export default {
     handleQuery() {
 
       console.log('查询');
-      this.getMaterialList('material', this.queryForm);
+      this.getMaterialList('material');
     },
     // 刷新
     handleRefresh() {
@@ -317,6 +333,11 @@ export default {
       }
       this.download('/system/material/export', params, `物料基本信息${new Date().getTime()}.xlsx`)
     },
+    // 下载模板
+    handleDownTemplate() {
+      console.log('下载模板');
+      this.download('/system/material/download', {}, `物料基本信息模板.xlsx`)
+    },
 
 
     // 操作弹窗显隐
@@ -361,8 +382,9 @@ export default {
 
       let param = {
         templateCode,
-        ...query
+        ...this.queryForm
       }
+      console.log(param, 'param');
       materialApi.materialList(param, page).then((res) => {
         _this.loading = false;
         console.log(res, '获取物料列表信息以及表头字段');
@@ -391,9 +413,32 @@ export default {
 
   },
   created() {
-    this.getMaterialList('material');
-    this.getTagList('material');
+    // this.getMaterialList('material');
+    // this.getTagList('material');
+  },
+  beforeRouteEnter(to, from, next) {
+    console.log(to, 'to', from, 'beforeRouteEnter');
+
+    next((vm) => {
+      if (from.name == 'materialDetail') {
+        // this.$store.getQuery(this.queryForm);
+        console.log(vm, 'queryValue', vm.$store);
+        vm.queryForm = vm.$store.state.query.queryVlue;
+      }
+      vm.getTagList('material');
+      vm.getMaterialList('material');
+    });
   },
+  // 进入详情,保留查询条件
+  beforeRouteLeave(to, from, next) {
+    console.log(to, 'to', from, 'beforeRouteLeave');
+    if (to.name == 'materialDetail') {
+      this.$store.commit('SET_QUERY', this.queryForm);
+    } else {
+      this.$store.commit('SET_QUERY', { name: '', code: '' });
+    }
+    next();
+  }
 
 };
 </script>
@@ -415,7 +460,7 @@ export default {
 
       .el-table__body-wrapper {
         // height: calc(100% - 150px);
-        height: calc(100% - 150px);
+        height: calc(100% - 70px);
         overflow-y: auto !important;
         overflow-x: auto !important;
         // .el-table__body {
@@ -432,7 +477,11 @@ export default {
 }
 
 .mb-import {
+  padding: 0 20%;
   text-align: center;
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-around;
 }
 </style>
 <style scoped>

+ 210 - 58
src/views/material/changeApply/add.vue

@@ -2,7 +2,7 @@
   <div class="apply_add">
     <el-tabs type="border-card" v-model="tabValue" @tab-click="handleClick">
       <el-tab-pane label="基本信息" name="first">
-        <el-form :model="basicForm" :rules="basicRules" ref="basic" label-width="160px">
+        <el-form :model="basicForm" :rules="basicRules" ref="basic" label-width="170px">
           <el-row :gutter="20">
             <el-col :span="8">
               <el-form-item label="单据编码" prop="code">
@@ -10,13 +10,13 @@
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="申请组织" prop="orgId">
+              <el-form-item label="所属组织" prop="orgId">
                 <el-input disabled v-model="basicForm.orgId"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
               <el-form-item label="物料编码" prop="materialCode">
-                <el-input :disabled="disable" v-model="basicForm.materialCode">
+                <el-input readonly :disabled="disable" v-model="basicForm.materialCode">
                   <el-button :disabled="disable" slot="append" icon="el-icon-more" @click="test01"></el-button>
                 </el-input>
               </el-form-item>
@@ -35,6 +35,7 @@
                     placeholder="医药物料"
                     clearable
                     :disabled="disable"
+                    @change="controlMedic"
                   >
                     <el-option
                       v-for="item in options"
@@ -47,24 +48,26 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="一级分类" prop="oneClass">
-                <el-input :disabled="disable" v-model="basicForm.oneClass"></el-input>
+                <el-input readonly :disabled="disable" v-model="basicForm.oneClass"></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row :gutter="20">
             <el-col :span="8">
               <el-form-item label="二级分类" prop="twoClass">
-                <el-input :disabled="disable" v-model="basicForm.twoClass"></el-input>
+                <el-input readonly :disabled="disable" v-model="basicForm.twoClass"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
               <el-form-item label="三级分类" prop="threeClass">
-                <el-input :disabled="disable" v-model="basicForm.threeClass"></el-input>
+                <el-input readonly :disabled="disable" v-model="basicForm.threeClass"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
               <el-form-item label="四级分类" prop="fourClass">
-                <el-input :disabled="disable" v-model="basicForm.fourClass"></el-input>
+                <el-input readonly :disabled="disable" v-model="basicForm.fourClass">
+                  <el-button :disabled="disable" slot="append" icon="el-icon-more" @click="chooseFourClass"></el-button>
+                </el-input>
               </el-form-item>
             </el-col>
           </el-row>
@@ -81,9 +84,24 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="生产厂家/代理人" prop="factory">
-                <el-input :disabled="disable" v-model="basicForm.factory">
+                <el-select
+                    ref="factoryOrman"
+                    v-model="basicForm.factory"
+                    placeholder="生产厂家/代理人"
+                    clearable
+                    :disabled="disable"
+                    @focus="chooseFactory"
+                  >
+                    <el-option
+                      v-for="item in factoryOptions"
+                      :key="item.id"
+                      :label="item.name"
+                      :value="item.id"
+                    />
+                </el-select>
+                <!-- <el-input :disabled="disable" v-model="basicForm.factory">
                   <el-button :disabled="disable" slot="append" icon="el-icon-more" @click="test02"></el-button>
-                </el-input>
+                </el-input> -->
               </el-form-item>
             </el-col>
           </el-row>
@@ -131,7 +149,7 @@
           <el-row :gutter="20">
             <el-col :span="8">
               <el-form-item label="交货周期" prop="leadTime">
-                <el-input :disabled="disable" v-model="basicForm.leadTime"></el-input>
+                <el-input type="number" min="0" :disabled="disable" v-model="basicForm.leadTime"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
@@ -150,9 +168,9 @@
               <el-form-item label="药品" prop="drug">
                 <el-select
                     v-model="basicForm2.drug"
-                    placeholder="药品"
+                    placeholder="请选择"
                     clearable
-                    :disabled="disable"
+                    :disabled="disable || isControl"
                   >
                     <el-option
                       v-for="dict in dict.type.sys_medicine"
@@ -165,16 +183,16 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="注册证号/备案凭证编号" prop="registrationNo">
-                <el-input :disabled="disable" v-model="basicForm2.registrationNo"></el-input>
+                <el-input :disabled="disable || isControl" v-model="basicForm2.registrationNo"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
               <el-form-item label="医疗器械" prop="medicalDevices">
                 <el-select
                     v-model="basicForm2.medicalDevices"
-                    placeholder="医疗器械"
+                    placeholder="请选择"
                     clearable
-                    :disabled="disable"
+                    :disabled="disable || isControl"
                   >
                     <el-option
                       v-for="dict in dict.type.medical_instruments"
@@ -191,9 +209,9 @@
               <el-form-item label="养护类型" prop="maintenanceType">
                 <el-select
                     v-model="basicForm2.maintenanceType"
-                    placeholder="养护类型"
+                    placeholder="请选择"
                     clearable
-                    :disabled="disable"
+                    :disabled="disable || isControl"
                   >
                     <el-option
                       v-for="dict in dict.type.curing_type"
@@ -257,18 +275,18 @@
         <el-form :model="basicForm" ref="info" label-width="160px">
           <el-row :gutter="20">
             <el-col :span="8">
-              <el-form-item label="申请人" prop="createBy">
-                <el-input disabled v-model="basicForm.createBy"></el-input>
+              <el-form-item label="申请人" prop="createByName">
+                <el-input disabled v-model="basicForm.createByName"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="申请时间" prop="applicationTime">
-                <el-input disabled v-model="basicForm.applicationTime"></el-input>
+              <el-form-item label="申请时间" prop="createTime">
+                <el-input disabled v-model="basicForm.createTime"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="创建人" prop="createBy">
-                <el-input disabled v-model="basicForm.createBy"></el-input>
+              <el-form-item label="创建人" prop="createByName">
+                <el-input disabled v-model="basicForm.createByName"></el-input>
               </el-form-item>
             </el-col>
           </el-row>
@@ -279,8 +297,8 @@
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="最后修改人" prop="updateBy">
-                <el-input disabled v-model="basicForm.updateBy"></el-input>
+              <el-form-item label="最后修改人" prop="updateByName">
+                <el-input disabled v-model="basicForm.updateByName"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
@@ -302,7 +320,19 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="单据状态" prop="status">
-                <el-input disabled v-model="basicForm.status"></el-input>
+                <el-select 
+                  v-model="basicForm.status"
+                  size="small"
+                  disabled
+                  >
+                  <el-option
+                    v-for="item in statusOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+                <!-- <el-input disabled v-model="basicForm.status"></el-input> -->
               </el-form-item>
             </el-col>
           </el-row>
@@ -315,7 +345,7 @@
         <el-button type="primary" size="small" plain @click="save" v-if="pageStu == 'add' || pageStu == 'edit'">保存</el-button>
       </el-col>
       <el-col :span="1.5" style="margin: 0 10px;">
-        <el-button type="primary" size="small" plain @click="submit" v-if="pageStu == 'add' || pageStu == 'edit'">提交</el-button>
+        <el-button type="primary" size="small" plain @click="submit" v-if="pageStu == 'edit'">提交</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button type="primary" size="small" plain @click="back">返回</el-button>
@@ -330,11 +360,18 @@
     />
 
     <factory
-      ref="contractSelect2"
-      @doSubmit="selectionsToInput2"
+      ref="factory"
+      @doSubmit="acceptFactory"
       :selectData="selectData2"
       :single="true"
     />
+
+    <fourClass
+      ref="fourClass"
+      @doSubmit="acceptFourClass"
+      :selectData="selectData3"
+      :single="true"
+    />
   </div>
 </template>
 
@@ -342,12 +379,19 @@
 import popDialog from '@/components/PopDialog/index.vue'
 import factory from '@/components/PopDialog/productFactory.vue'
 import { addChangeList, getMaterialDetails, getChangeDetails, editChangeList } from '@/api/changeApply/basic'
+// 生产厂商/代理人调用用于回显
+import { getProductFactory } from '@/api/changeApply/basic'
+// 四级分类
+import fourClass from '@/components/PopDialog/fourClass.vue'
+// 调用物料分类详情接口用于数据回显
+import { getDetail } from '@/api/classify/basic';
 export default {
   name: 'applyAdd',
   dicts: ['sys_storage_condition', 'sys_conditions_carriage', 'sys_medicine', 'medical_instruments', 'curing_type'],
   components: {
     popDialog,
-    factory
+    factory,
+    fourClass
   },
   props: ['pageStu', 'row', 'disable'],
   model: {
@@ -356,15 +400,17 @@ export default {
   },
   data() {
     return{
+      factoryOptions: [],
       tabValue: 'first',
+      isControl: true,
       basicForm: {
         code: '',
-        orgId: '',
+        orgId: '德荣集团',
         // 物料id
         materialId:'',
         materialCode: '',
         materialName: '',
-        medicineMaterial: '',
+        medicineMaterial: '2',
         oneClass: '',
         twoClass: '',
         threeClass: '',
@@ -396,7 +442,30 @@ export default {
         value: '2',
         label: '否'
       }],
-      basicRules: {},
+      statusOptions: [{
+        value: 0, label: '未提交'
+      },{
+        value: 1, label: '审批中'
+      },{
+        value: 2, label: '已完成'
+      },{
+        value: 3, label: '已驳回'
+      },],
+      basicRules: {
+        materialCode: [{  required: true, message: '请选择物料编码', trigger: 'blur' }],
+        materialName: [{required: true, message: '请填写物料名称', trigger: 'blur'}],
+        oneClass: [{required: true, message: '请填写一级分类', trigger: 'blur'}],
+        twoClass: [{required: true, message: '请填写二级分类', trigger: 'blur'}],
+        threeClass: [{required: true, message: '请填写三级分类', trigger: 'blur'}],
+        fourClass: [{required: true, message: '请选择四级分类', trigger: 'blur'}],
+        specification: [{required: true, message: '请填写规格', trigger: 'blur'}],
+        model: [{required: true, message: '请填写型号', trigger: 'blur'}],
+        factory: [{required: true, message: '请选择生产厂家/代理人', trigger: 'blur'}],
+        registrant: [{required: true, message: '请填写注册人/上市许可持有人', trigger: 'blur'}],
+        storageConditions: [{required: true, message: '请选择存储条件', trigger: 'blur'}],
+        transportCondition: [{required: true, message: '请选择运输条件', trigger: 'blur'}],
+        leadTime: [{required: true, message: '请填写交货周期', trigger: 'blur'}],
+      },
       basicForm2: {
         drug: '',
         registrationNo: '',
@@ -412,7 +481,8 @@ export default {
       // 弹窗
       name: '',
       selectData: [],
-      selectData2: []
+      selectData2: [],
+      selectData3: []
     }
   },
   // watch: {
@@ -448,11 +518,25 @@ export default {
         console.log('页面状态',this.pageStu)
         console.log('数据', this.row)
         this.getDetails(this.row)
+        // 生产厂家代理人用于回显
+        if (this.row.factory) {
+          this.getFactoryDetails(this.row.factory)
+        }
       } else if (this.pageStu == 'edit') {
         // alert('修改页面')
         console.log('页面状态',this.pageStu)
         console.log('数据', this.row)
         this.getDetails(this.row)
+        // 控制医药属性是否能够填写
+        if (this.row.medicineMaterial == '0') {
+          this.isControl = false
+        } else {
+          this.isControl = true
+        }
+        // 生产厂家代理人用于回显
+        if (this.row.factory) {
+          this.getFactoryDetails(this.row.factory)
+        }
       } else if(this.pageStu == 'add') {
         // alert('新增页面')
         console.log('页面状态',this.pageStu)
@@ -460,6 +544,27 @@ export default {
     })
   },
   methods: {
+    // 生产厂家/代理人用于回显
+    getFactoryDetails(id) {
+       getProductFactory({id:id}).then(res => {
+        if(res.code === 200) {
+          this.factoryOptions = res.data.tableBody
+        }
+       })
+    },
+    // 选择是否医药物料时控制医药属性
+    controlMedic(val) {
+      console.log('val',val)
+      if (val == '0') {
+        this.isControl = false
+      } else {
+        this.basicForm2.drug = ''
+        this.basicForm2.registrationNo = ''
+        this.basicForm2.medicalDevices = ''
+        this.basicForm2.maintenanceType = ''
+        this.isControl = true
+      }
+    },
     handleClick(tab, event) {
       console.log(tab, event);
       console.log('页面状态',this.pageStu)
@@ -469,7 +574,9 @@ export default {
       getChangeDetails(row.id).then(res => {
         if(res.code === 200) {
           this.basicForm = res.data
-          this.basicForm2 = res.data.medicineChange
+          if (res.data.medicineChange) {
+            this.basicForm2 = res.data.medicineChange
+          }
         }
       })
     },
@@ -478,13 +585,17 @@ export default {
       let sparams = {...this.basicForm, ...{status: 0}}
       sparams.medicineChange = this.basicForm2
       console.log('保存参数', sparams)
-      addChangeList(sparams).then(res => {
-        if(res.code === 200) {
-          this.$message({
-            message: res.msg,
-            type: 'success'
-          });
-          this.back()
+      this.$refs['basic'].validate((valid) => {
+        if (valid) {
+          addChangeList(sparams).then(res => {
+            if(res.code === 200) {
+              this.$message({
+                message: res.msg,
+                type: 'success'
+              });
+              this.back()
+            }
+          })
         }
       })
     },
@@ -493,13 +604,17 @@ export default {
       let sparams = {...this.basicForm, ...{status: 1}}
       sparams.medicineChange = this.basicForm2
       console.log('提交参数', sparams)
-      editChangeList(sparams).then(res => {
-        if(res.code === 200) {
-          this.$message({
-            message: res.msg,
-            type: 'success'
-          });
-          this.back()
+      this.$refs['basic'].validate((valid) => {
+        if(valid) {
+          editChangeList(sparams).then(res => {
+            if(res.code === 200) {
+              this.$message({
+                message: res.msg,
+                type: 'success'
+              });
+              this.back()
+            }
+          })
         }
       })
     },
@@ -567,10 +682,14 @@ export default {
           this.basicForm.fourClass = data.fourClass
           this.basicForm.specification = data.specification
           this.basicForm.model = data.model
+          this.basicForm.factory = data.manufacturerId
           this.basicForm.registrant = data.registrant
           this.basicForm.storageConditions = data.storageCondition
           this.basicForm.transportCondition = data.transportationCondition
-          this.basicForm.remark = data.deliveryPeriod
+          this.basicForm.leadTime = data.deliveryPeriod
+          if(data.manufacturerId) {
+            this.getFactoryDetails(data.manufacturerId)
+          }
           if(data.medcines.length !== 0) {
             this.basicForm2.drug = data.medcines[0].isDrug
             this.basicForm2.registrationNo = data.medcines[0].registrationNo
@@ -580,19 +699,51 @@ export default {
         }
       })
     },
-    selectionsToInput2 (selections) {
-      console.log('选择的数据',selections)
-      this.basicForm.factory = selections[0].manufactureName
-    },
+    // selectionsToInput2 (selections) {
+    //   console.log('选择的数据',selections)
+    //   this.basicForm.factory = selections[0].manufactureName
+    // },
     // 显示列表
     test01() {
       console.log('测试点击')
       this.$refs.contractSelect.init()
     },
-    test02() {
-      console.log('测试弹窗2');
-      this.$refs.contractSelect2.init()
-    }
+    // test02() {
+    //   console.log('测试弹窗2');
+    //   this.$refs.contractSelect2.init()
+    // },
+    // 选择生产厂家/代理人
+    acceptFactory (selections) {
+      console.log('选择的数据',selections)
+      this.factoryOptions = selections
+      this.basicForm.factory = selections[0].id
+      this.getFactoryDetails(selections[0].id)
+    },
+    // 生产厂家/代理人显示列表
+    chooseFactory() {
+      this.$refs.factoryOrman.blur()
+      this.$refs.factory.init()
+    },
+    // 选择四级分类
+    acceptFourClass(selections) {
+      console.log('收到的四级分类',selections)
+      this.getTreeDetails(selections.id)
+    },
+    // 四级分类显示列表
+    chooseFourClass() {
+      this.$refs.fourClass.init()
+    },
+    // 选择四级分类后需要根据id再次查询一下123级分类
+    getTreeDetails(id) {
+      getDetail(id).then(res => {
+        if (res.code === 200) {
+          this.basicForm.oneClass = res.data.oneClass
+          this.basicForm.twoClass = res.data.twoClass
+          this.basicForm.threeClass = res.data.threeClass
+          this.basicForm.fourClass = res.data.fourClass
+        }
+      })
+    },
   }
 }
 </script>
@@ -602,6 +753,7 @@ export default {
   height: calc(100vh - 84px);
   padding: 12px;
   box-sizing: border-box;
+  overflow-y: auto;
 }
 .btn_group {
   width: 100%;

+ 94 - 55
src/views/material/changeApply/index.vue

@@ -1,59 +1,85 @@
 <template>
   <div class="changeApply">
     <div class="applyList" v-if="isList">
-    <el-row :gutter="10" class="mb10">
-      <el-col :span="1.5">
+      <el-row :gutter="10" class="mb10">
+          <!-- <el-select size="small" v-model="textValue" placeholder="请选择">
+          <el-option
+            v-for="item in text"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
 
-        <el-select size="small" v-model="textValue" placeholder="请选择">
-        <el-option
-          v-for="item in text"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value">
-        </el-option>
-      </el-select>
+        <el-select size="small" v-model="ruleValue" placeholder="请选择">
+          <el-option
+            v-for="item in rule"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select> -->
+        <el-col :span="1.5">
+          <span style="font-size: 14px;margin-right: 5px;">物料编码</span>
+          <el-input
+            v-model="queryParams.materialCode"
+            size="small"
+            placeholder="请输入物料编码查询"
+            clearable
+            style="width: 240px"
+          />
+        </el-col>
 
-      <el-select size="small" v-model="ruleValue" placeholder="请选择">
-        <el-option
-          v-for="item in rule"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value">
-        </el-option>
-      </el-select>
+        <el-col :span="1.5">
+          <span style="font-size: 14px;margin-right: 5px;">物料名称</span>
+          <el-input
+            v-model="queryParams.materialName"
+            size="small"
+            placeholder="请输入物料名称查询"
+            clearable
+            style="width: 240px"
+          />
+        </el-col>
 
-      <el-input
-        v-model="input"
-        size="small"
-        placeholder="请输入"
-        clearable
-        style="width: 240px"
-      />
+        <el-col :span="1.5">
+          <span style="font-size: 14px;margin-right: 5px;">单据状态</span>
+          <el-select 
+            v-model="queryParams.status"
+            size="small"
+            placeholder="请选择单据状态"
+            clearable
+            style="width: 240px">
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-col>
 
-      </el-col>
+        <el-col :span="1.5">
+          <el-button type="primary" size="small" plain @click="getList(queryParams)">查询</el-button>
+        </el-col>
+        <!-- <el-col :span="1.5">
+          <el-button type="primary" size="small" plain>高级查询</el-button>
+        </el-col> -->
+        <el-col :span="1.5">
+          <el-button type="primary" size="small" plain @click="reset">重置</el-button>
+        </el-col>
 
-      <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>查询</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>高级查询</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>重置</el-button>
-      </el-col>
-
-    </el-row>
+      </el-row>
 
     <el-row :gutter="10" class="mb10">
       <el-col :span="1.5">
         <el-button type="primary" size="small" plain @click="newAdd">新增</el-button>
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button type="primary" size="small" plain>导入</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button type="primary" size="small" plain>导出</el-button>
-      </el-col>
+      </el-col> -->
       <!-- <el-col :span="1.5">
         <el-button type="primary" size="small" plain>批量提交</el-button>
       </el-col>
@@ -71,18 +97,18 @@
         @selection-change="handleSelectionChange"
       >
         <!-- <el-table-column type="selection" width="55" /> -->
-        <el-table-column label="序号" align="center" prop="sort" />
-        <el-table-column label="申请组织" align="center" prop="orgId" />
+        <el-table-column label="序号" align="center" type="index" width="50" />
+        <el-table-column label="申请组织" align="center" width="200" prop="orgId" />
         <el-table-column label="单据编码" align="center" width="200" prop="code" />
-        <el-table-column label="申请时间" align="center" width="150" prop="applicationTime" />
+        <el-table-column label="申请时间" align="center" width="150" prop="createTime" />
         <el-table-column label="单据状态" align="center" prop="status" :formatter="statusJug" />
         <el-table-column label="物料编码" align="center" width="150" prop="materialCode" />
-        <el-table-column label="物料名称" align="center" prop="materialName" />
-        <el-table-column label="最后审批人" align="center" width="120" prop="approver" />
-        <el-table-column label="最后审核时间" align="center" width="150" prop="approvalTime" />
-        <el-table-column label="创建人" align="center" prop="createBy" />
+        <el-table-column label="物料名称" align="center" width="150" prop="materialName" />
+        <!-- <el-table-column label="最后审批人" align="center" width="120" prop="approver" />
+        <el-table-column label="最后审核时间" align="center" width="150" prop="approvalTime" /> -->
+        <el-table-column label="创建人" align="center" prop="createByName" />
         <el-table-column label="创建时间" align="center" width="150" prop="createTime" />
-        <el-table-column label="最后修改人" align="center" width="120" prop="updateBy" />
+        <el-table-column label="最后修改人" align="center" width="120" prop="updateByName" />
         <el-table-column label="最后修改时间" align="center" width="150" prop="updateTime" />
         <el-table-column
           fixed="right"
@@ -92,8 +118,8 @@
           >
           <template slot-scope="scope">
             <el-button type="text" size="small" @click="check(scope.row)">查看</el-button>
-            <el-button @click="edit(scope.row)" v-if="scope.row.status == 0 || scope.row.status == 4" type="text" size="small">编辑</el-button>
-            <el-button type="text" size="small" @click="deleteRow(scope.row)">删除</el-button>
+            <el-button @click="edit(scope.row)" v-if="scope.row.status == 0 || scope.row.status == 3" type="text" size="small">编辑</el-button>
+            <el-button type="text" size="small" @click="deleteRow(scope.row)" v-if="scope.row.status == 0 || scope.row.status == 3">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -124,17 +150,23 @@ export default {
   },
   data() {
     return{
-      textValue: 1,
-      text: [{label: '文本字段', value: 1}, {label: '字典字段', value: 2}],
-      ruleValue: 1,
-      rule:[{label: '包含', value: 1}, {label: '不包含', value: 2}, {label: '等于', value: 3}, {label: '不等于', value: 4}],
-      input: '',
-      // 
       tableList: [],
       queryParams: {
+        materialCode: '',
+        materialName: '',
+        status: '',
         pageNum: 1,
         pageSize: 10
       },
+      options: [{
+        value: 0, label: '未提交'
+      },{
+        value: 1, label: '审批中'
+      },{
+        value: 2, label: '已完成'
+      },{
+        value: 3, label: '已驳回'
+      },],
       total:0,
       // isComponent
       isComponent:'addApply',
@@ -152,6 +184,13 @@ export default {
     this.getList(this.queryParams)
   },
   methods: {
+    reset() {
+      this.queryParams.materialCode = ''
+      this.queryParams.materialName = ''
+      this.queryParams.pageNum = 1
+      this.queryParams.status = ''
+      this.getList(this.queryParams)
+    },
     newAdd() {
       this.isList = false
       this.isComponent = 'addApply'

+ 220 - 124
src/views/material/classify/index.vue

@@ -2,29 +2,36 @@
   <div class="classify">
     <el-row :gutter="10" class="mb10">
       <el-col :span="1.5">
-        <el-button type="primary" size="small" plain @click="addClassify">新增</el-button>
+        <el-button type="primary" size="small" plain @click="addClassify"
+          >新增</el-button
+        >
       </el-col>
       <el-col :span="1.5">
-        <el-button type="primary" size="small" plain @click="editClassify">修改</el-button>
+        <el-button type="primary" size="small" plain @click="editClassify"
+          >修改</el-button
+        >
       </el-col>
       <el-col :span="1.5">
-        <el-button type="primary" size="small" plain @click="deleteClassify">删除</el-button>
+        <el-button type="primary" size="small" plain @click="deleteClassify"
+          >删除</el-button
+        >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button type="primary" size="small" plain>启用</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button type="primary" size="small" plain>停用</el-button>
-      </el-col>
+      </el-col> -->
     </el-row>
 
-    <el-card>
+    <el-card v-loading="loading">
       <el-row :gutter="10" class="content">
         <el-col :span="6">
           <el-input
             placeholder="输入关键字进行过滤"
             size="small"
-            v-model="filterText">
+            v-model="filterText"
+          >
           </el-input>
 
           <el-tree
@@ -34,26 +41,41 @@
             node-key="id"
             @node-click="clickTree"
             highlight-current
-            :default-expanded-keys="[1]"
-            :default-checked-keys="[2]"
+            :default-expanded-keys="defaultExpanded"
             :filter-node-method="filterNode"
-            ref="tree">
+            ref="tree"
+          >
+            <span slot-scope="{ node, data }">
+              {{ data.materialType }} {{ data.code }}
+            </span>
           </el-tree>
         </el-col>
 
         <el-col :span="18">
           <span class="title">基本信息</span>
-          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="140px" class="demo-ruleForm">
+          <el-form
+            :model="ruleForm"
+            :rules="rules"
+            ref="ruleForm"
+            label-width="140px"
+            class="demo-ruleForm"
+          >
             <el-row :gutter="20">
               <el-col :span="12">
                 <el-form-item label="物料基本分类编码" prop="code">
-                  <el-input :disabled="disable" v-model="ruleForm.code"></el-input>
+                  <el-input
+                    :disabled="disable"
+                    v-model="ruleForm.code"
+                  ></el-input>
                   <span>编码规则x-xxx-xxx-xxx</span>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
                 <el-form-item label="物料基本分类名称" prop="materialType">
-                  <el-input :disabled="disable" v-model="ruleForm.materialType"></el-input>
+                  <el-input
+                    :disabled="disable"
+                    v-model="ruleForm.materialType"
+                  ></el-input>
                 </el-form-item>
               </el-col>
             </el-row>
@@ -101,15 +123,25 @@
             <el-row :gutter="20">
               <el-col :span="24">
                 <el-form-item label="" prop="name">
-                  <el-checkbox-group :disabled="disable" v-model="checkList">
-                  <el-checkbox label="库存状态"></el-checkbox>
+                  <!-- <el-checkbox-group :disabled="disable" v-model="checkList"> -->
+                  <el-checkbox
+                    :disabled="disable"
+                    v-model="ruleForm.isInventory"
+                    label="isInventory"
+                    >库存状态</el-checkbox
+                  >
                   <!-- <el-checkbox label="项目"></el-checkbox>
                   <el-checkbox label="供应商"></el-checkbox>
                   <el-checkbox label="生产厂商"></el-checkbox>
                   <el-checkbox label="客户"></el-checkbox>
                   <el-checkbox label="特征码"></el-checkbox> -->
-                  <el-checkbox label="产品批号"></el-checkbox>
-                </el-checkbox-group>
+                  <el-checkbox
+                    :disabled="disable"
+                    v-model="ruleForm.isProductBatch"
+                    label="isProductBatch"
+                    >产品批号</el-checkbox
+                  >
+                  <!-- </el-checkbox-group> -->
                 </el-form-item>
               </el-col>
             </el-row>
@@ -117,12 +149,14 @@
             <el-row :gutter="20">
               <el-col :span="24">
                 <el-form-item v-if="!disable">
-                  <el-button type="primary" @click="submitForm('ruleForm')">保存</el-button>
+                  <el-button type="primary" @click="submitForm('ruleForm')"
+                    >保存</el-button
+                  >
                   <el-button @click="resetForm('ruleForm')">取消</el-button>
                 </el-form-item>
               </el-col>
             </el-row>
-            </el-form>
+          </el-form>
         </el-col>
       </el-row>
     </el-card>
@@ -130,178 +164,239 @@
 </template>
 
 <script>
-import { getTree, getDetail, add, delClassify, edit} from '@/api/classify/basic';
+import {
+  getTree,
+  getDetail,
+  add,
+  delClassify,
+  edit,
+} from "@/api/classify/basic";
 export default {
-  name:'classify',
-  dicts: ['material_enable', 'sys_assist_condtion'],
+  name: "classify",
+  dicts: ["material_enable", "sys_assist_condtion"],
   data() {
     return {
-      filterText: '',
+      loading: false,
+      filterText: "",
       data: [],
       defaultProps: {
-          children: 'childrens',
-          label: 'materialType'
+        children: "childrens",
+        label: "materialType",
       },
       ruleForm: {
-        code: '',
-        materialType: '',
-        isEnable: '0',
-        delFlag: '',
-        marasstframe: '',
+        code: "",
+        materialType: "",
+        isEnable: "0",
+        delFlag: "",
+        marasstframe: "",
+        isInventory: "",
+        isProductBatch: "",
       },
       rules: {
-        code:[{ required: true, message: '请输入物料基本分类编码', trigger: 'blur' }],
-        materialType:[{ required: true, message: '请输入物料基本分类名称', trigger: 'blur' }],
+        code: [
+          {
+            required: true,
+            message: "请输入物料基本分类编码",
+            trigger: "blur",
+          },
+        ],
+        materialType: [
+          {
+            required: true,
+            message: "请输入物料基本分类名称",
+            trigger: "blur",
+          },
+        ],
       },
       checkList: [],
       disable: true,
-      biao: {parentId: 0},
+      biao: { parentId: 0 },
       // 删除节点id
-      delId: '',
+      delId: "",
       // 判断是新增还是修改
-      isAdd: true
+      isAdd: true,
+      defaultExpanded: [],
+    };
+  },
+  watch: {
+    filterText(val) {
+      this.$refs.tree.filter(val);
     }
   },
   created() {
-    this.getTreeData()
-    // 
-  },
-  mounted() {
+    this.getTreeData();
+    //
   },
+  mounted() {},
   methods: {
     // 获取树形结构
     getTreeData(data) {
-      getTree(data).then(res => {
-        let {code, rows} = res
-        if(code === 200) {
-          this.data = rows
-        }
-      })
+      this.loading = true;
+      getTree(data)
+        .then((res) => {
+          let { code, rows } = res;
+          if (code === 200) {
+            this.data = rows;
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     // 获取物料基本分类详情
     getDetailData(id) {
-      getDetail(id).then(res => {
-        let {code, data} = res
+      getDetail(id).then((res) => {
+        let { code, data } = res;
         if (code === 200) {
-          console.log('data', data)
-          this.ruleForm = data
+          console.log("data", data);
+          this.ruleForm = data;
+          this.ruleForm.isInventory = data.isInventory === "0" ? true : false;
+          this.ruleForm.isProductBatch =
+            data.isProductBatch === "0" ? true : false;
         }
-      })
+      });
     },
     filterNode(value, data) {
-        if (!value) return true;
-        return data.label.indexOf(value) !== -1;
+      if (!value) return true;
+      return data.materialType.indexOf(value) !== -1;
     },
-    clickTree(data){
-      console.log('data', data)
+    clickTree(data, node) {
+      console.log("data", data, node);
       // 如果点击新增时选择了树形节点,则不回显数据,且需要清空ruleForm内的数据
       if (this.disable) {
-        this.getDetailData(data.id)
+        this.getDetailData(data.id);
       } else {
-        this.$refs['ruleForm'].resetFields();
+        this.$refs["ruleForm"].resetFields();
       }
       // 标记是否为树形结构最外层
-      this.biao.parentId = data.id
+      this.biao.parentId = data.id;
       // 将节点id用作删除id
-      this.delId = data.id
+      this.delId = data.id;
+
+      let { id } = data;
+
+      if (this.defaultExpanded.findIndex((item) => item === id) === -1) {
+        this.defaultExpanded.push(id);
+        this.defaultExpanded = [...new Set(this.defaultExpanded)];
+      } else {
+        this.defaultExpanded = this.defaultExpanded.filter(
+          (item) => item !== id
+        );
+      }
     },
     submitForm(formName) {
-        this.$refs[formName].validate((valid) => {
-          if (valid) {
-            if(this.isAdd) { //判断是走新增还是修改
-              console.log('add!');
-              console.log(this.biao.parentId)
-              console.log(this.ruleForm)
-              let params = {...this.ruleForm, ...this.biao}
-              console.log('params',params)
-              add(params).then(res => {
-                if(res.code === 200) {
-                  this.$message({
-                    message: res.msg,
-                    type: 'success'
-                  });
-                  this.getTreeData()
-                  // this.$refs['ruleForm'].resetFields();
-                  this.disable = true
-                }
-              })
-            } else { //修改
-              console.log('edit')
-              let ids = {id: this.biao.parentId}
-              console.log('ids', ids)
-              let params = {...this.ruleForm, ...ids}
-              console.log('params', params)
-              edit(params).then(res => {
-                if(res.code === 200) {
-                  this.$message({
-                    message: res.msg,
-                    type: 'success'
-                  });
-                  this.disable = true
-                }
-              })
-            }
+      let isInventory = this.ruleForm.isInventory ? "0" : "2";
+      let isProductBatch = this.ruleForm.isProductBatch ? "0" : "2";
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (this.isAdd) {
+            //判断是走新增还是修改
+            console.log("add!");
+            console.log(this.biao.parentId);
+            console.log(this.ruleForm);
+            let params = {
+              ...this.ruleForm,
+              ...this.biao,
+              isInventory,
+              isProductBatch,
+            };
+            console.log("params", params);
+            add(params).then((res) => {
+              if (res.code === 200) {
+                this.$message({
+                  message: res.msg,
+                  type: "success",
+                });
+                this.getTreeData();
+                // this.$refs['ruleForm'].resetFields();
+                this.disable = true;
+              }
+            });
           } else {
-            console.log('error submit!!');
-            return false;
+            //修改
+            console.log("edit");
+            let ids = { id: this.biao.parentId };
+            console.log("ids", ids);
+            let params = {
+              ...this.ruleForm,
+              ...ids,
+              isInventory,
+              isProductBatch,
+            };
+            console.log("params", params);
+            edit(params).then((res) => {
+              if (res.code === 200) {
+                this.$message({
+                  message: res.msg,
+                  type: "success",
+                });
+                this.getTreeData();
+                // this.currentNode = params;
+                console.log("this.data", this.defaultExpanded);
+                this.disable = true;
+              }
+            });
           }
-        });
-      },
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
     resetForm(formName) {
-      console.log(formName)
-      if(this.isAdd) {
+      console.log(formName);
+      if (this.isAdd) {
         this.$refs[formName].resetFields();
-        this.disable = true
+        this.disable = true;
       } else {
-        this.disable = true
+        this.disable = true;
       }
     },
     // 点击新增按钮
     addClassify() {
       // console.log('值呢:', this.ruleForm)
       // 如果点击了树形节点后再点击新增,则清空数据再填写
-      if(this.biao.parentId !== 0) {
-        this.$refs['ruleForm'].resetFields();
+      if (this.biao.parentId !== 0) {
+        this.$refs["ruleForm"].resetFields();
       }
-      this.disable = false
-      this.isAdd = true
+      this.disable = false;
+      this.isAdd = true;
     },
     // 删除按钮
     deleteClassify() {
-      
-      if(this.biao.parentId == 0) {
+      if (this.biao.parentId == 0) {
         this.$message({
-          message: '请选择删除节点',
-          type: 'warning'
+          message: "请选择删除节点",
+          type: "warning",
         });
       } else {
-        console.log('删除', this.delId)
-        delClassify({id: this.delId}).then(res => {
+        console.log("删除", this.delId);
+        delClassify({ id: this.delId }).then((res) => {
           if (res.code === 200) {
+            this.getTreeData();
             this.$message({
-              message: '删除成功',
-              type: 'success'
+              message: "删除成功",
+              type: "success",
             });
-            this.getTreeData()
           }
-        })
+        });
       }
     },
     // 修改按钮
     editClassify() {
-      if(this.biao.parentId == 0) {
+      if (this.biao.parentId == 0) {
         this.$message({
-          message: '请选择修改节点',
-          type: 'warning'
+          message: "请选择修改节点",
+          type: "warning",
         });
       } else {
-        console.log('修改')
-        this.disable = false
-        this.isAdd = false
+        console.log("修改");
+        this.disable = false;
+        this.isAdd = false;
       }
-    }
+    },
   },
-}
+};
 </script>
 
 <style scoped lang="scss">
@@ -309,8 +404,9 @@ export default {
   height: calc(100vh - 84px);
   padding: 12px;
   box-sizing: border-box;
+  overflow-y: auto;
 }
 .title {
   font-weight: bold;
 }
-</style>
+</style>

+ 9 - 13
src/views/material/label/index.vue

@@ -1,30 +1,26 @@
 <script>
-import LabelTree from "./lable-tree.vue";
-import LabelTable from "./lable-table.vue";
+import LabelTable from "./label-table.vue";
+import LabelAddDialog from "./label-add-dialog.vue";
+import LabelEditDialog from "./label-edit-dialog.vue";
 export default {
   name: "MaterialLabel",
   components: {
-    LabelTree,
     LabelTable,
+    LabelAddDialog,
+    LabelEditDialog,
   },
   data() {
     return {};
   },
-  methods: {
-    onNodeClick({ label }) {
-      console.log("213", this);
-      this.$message(label);
-    },
-  },
+  methods: {},
 };
 </script>
 
 <template>
   <el-container class="container material-label">
-    <el-aside width="275px">
-      <label-tree></label-tree>
-    </el-aside>
     <label-table></label-table>
+    <label-add-dialog></label-add-dialog>
+    <label-edit-dialog></label-edit-dialog>
   </el-container>
 </template>
 
@@ -36,7 +32,7 @@ export default {
 }
 .container {
   width: calc(100% - calc(var(--size) * 2));
-  height: calc(100vh - calc(var(--size) * 2));
+  /* height: calc(100vh - calc(var(--size) * 2)); */
   margin: var(--margin);
   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
 }

+ 148 - 0
src/views/material/label/label-add-dialog.vue

@@ -0,0 +1,148 @@
+<script>
+import { add, type } from "@/api/material/label";
+export default {
+  name: "MaterialAddLabelDialog",
+  data() {
+    const initDict = {
+      label_type: [
+        { label: "类别", value: 1 },
+        { label: "标签", value: 2 },
+      ],
+      parent_id: [],
+    };
+    const initColumns = [
+      {
+        type: "select",
+        prop: "label_type",
+        label: "标签类别",
+        required: true,
+      },
+      {
+        type: "select",
+        prop: "parent_id",
+        label: "上级类别",
+        required: false,
+      },
+      {
+        type: "text",
+        prop: "name",
+        label: "名称",
+        required: true,
+      },
+      {
+        type: "textarea",
+        prop: "description",
+        label: "说明",
+        required: false,
+      },
+    ];
+    const initForm = () => {
+      let form = {};
+      initColumns.forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      form: initForm(),
+      columns: initColumns,
+      dict: initDict,
+    };
+  },
+  methods: {
+    fetchType() {
+      this.loading = true;
+      type()
+        .then((res) => {
+          this.dict.parent_id = res.map((item) => ({
+            value: item.id,
+            label: item.name,
+          }));
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.loading = true;
+          if (this.form.label_type === 1) this.form.parent_id = 0;
+          add(this.form)
+            .then((res) => {
+              let { code } = res;
+              if (code === 200) {
+                this.dialogFormVisible = false;
+                this.$message.success("success");
+                this.$parent.$children[0].fetchList();
+                this.form = {};
+              }
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+  created() {
+    this.fetchType();
+  },
+};
+</script>
+
+<template>
+  <el-dialog destroy-on-close title="新增" :visible.sync="dialogFormVisible">
+    <el-form :model="form" ref="addForm" label-position="top">
+      <el-form-item prop="label_type" label="标签类别" required>
+        <el-select v-model="form.label_type">
+          <el-option
+            v-for="item in dict.label_type"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        v-if="form.label_type === 2"
+        prop="parent_id"
+        label="上级类别"
+        :required="form.label_type === 2"
+      >
+        <el-select v-model="form.parent_id">
+          <el-option
+            v-for="item in dict.parent_id"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="name" label="名称" required>
+        <el-input v-model="form.name"></el-input>
+      </el-form-item>
+      <el-form-item prop="description" label="说明">
+        <el-input
+          v-model="form.description"
+          type="textarea"
+          autosize
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button :disabled="loading" @click="dialogFormVisible = false"
+        >取 消</el-button
+      >
+      <el-button type="primary" :disabled="loading" @click="onSubmit('addForm')"
+        >确 定</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<style scoped></style>

+ 153 - 0
src/views/material/label/label-edit-dialog.vue

@@ -0,0 +1,153 @@
+<script>
+import { add, type } from "@/api/material/label";
+export default {
+  name: "MaterialAddLabelDialog",
+  data() {
+    const initDict = {
+      label_type: [
+        { label: "类别", value: 1 },
+        { label: "标签", value: 2 },
+      ],
+      parent_id: [],
+    };
+    const initColumns = [
+      {
+        type: "select",
+        prop: "label_type",
+        label: "标签类别",
+        required: true,
+      },
+      {
+        type: "select",
+        prop: "parent_id",
+        label: "上级类别",
+        required: false,
+      },
+      {
+        type: "text",
+        prop: "name",
+        label: "名称",
+        required: true,
+      },
+      {
+        type: "textarea",
+        prop: "description",
+        label: "说明",
+        required: false,
+      },
+    ];
+    const initForm = () => {
+      let form = {};
+      initColumns.forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      form: initForm(),
+      columns: initColumns,
+      dict: initDict,
+    };
+  },
+  methods: {
+    fetchType() {
+      this.loading = true;
+      type()
+        .then((res) => {
+          this.dict.parent_id = res.map((item) => ({
+            value: item.id,
+            label: item.name,
+          }));
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+
+    fetchItem(prop) {
+      this.dialogFormVisible = true;
+      this.form = prop;
+    },
+
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.loading = true;
+          if (this.form.label_type === 1) this.form.parent_id = 0;
+          add(this.form)
+            .then((res) => {
+              let { code } = res;
+              if (code === 200) {
+                this.dialogFormVisible = false;
+                this.$message.success("success");
+                this.$parent.$children[0].fetchList();
+                this.form = {};
+              }
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+  created() {
+    this.fetchType();
+  },
+};
+</script>
+
+<template>
+  <el-dialog destroy-on-close title="新增" :visible.sync="dialogFormVisible">
+    <el-form :model="form" ref="addForm" label-position="top">
+      <el-form-item prop="label_type" label="标签类别" required>
+        <el-select v-model="form.label_type">
+          <el-option
+            v-for="item in dict.label_type"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        v-if="form.label_type === 2"
+        prop="parent_id"
+        label="上级类别"
+        :required="form.label_type === 2"
+      >
+        <el-select v-model="form.parent_id">
+          <el-option
+            v-for="item in dict.parent_id"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="name" label="名称" required>
+        <el-input v-model="form.name"></el-input>
+      </el-form-item>
+      <el-form-item prop="description" label="说明">
+        <el-input
+          v-model="form.description"
+          type="textarea"
+          autosize
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button :disabled="loading" @click="dialogFormVisible = false"
+        >取 消</el-button
+      >
+      <el-button type="primary" :disabled="loading" @click="onSubmit('addForm')"
+        >确 定</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<style scoped></style>

+ 310 - 0
src/views/material/label/label-table.vue

@@ -0,0 +1,310 @@
+<script>
+import { list, item, remove } from "@/api/material/label";
+export default {
+  name: "MaterialLabelTable",
+  // props: ["columns"],
+  data() {
+    const initColumns = () => [
+      {
+        type: "text",
+        prop: "name",
+        label: "名称",
+        required: true,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "select",
+        prop: "status",
+        label: "状态",
+        required: true,
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "description",
+        label: "说明",
+        required: false,
+        showOverflowTooltip: true,
+      },
+    ];
+    const initForm = () => {
+      let form = {};
+      initColumns().forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    const initOptions = () =>
+      initColumns().map((item) => ({ label: item.label, value: item.prop }));
+    return {
+      loading: false,
+      form: initForm(),
+      options: initOptions(),
+      currentOption: { prop: "", type: "" },
+      columns: initColumns(),
+      tableData: [],
+      page: { pageNum: 1, pageSize: 25, total: 0 },
+    };
+  },
+
+  methods: {
+    sleep(delay = 1000) {
+      let start = +new Date();
+      while (+new Date() - start < delay) {}
+    },
+
+    fetchList() {
+      this.loading = true;
+      let data = this.form;
+      let { pageNum, pageSize } = this.page;
+      list(data, { pageNum, pageSize })
+        .then((res) => {
+          let { code, rows, total } = res;
+          if (code === 200) {
+            this.tableData = [];
+            this.tableData = rows.map((item) => ({
+              ...item,
+              hasChildrens: item.childrens.length ? true : false,
+            }));
+            this.page.total = total;
+            this.$message.success("success");
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+
+    fetchRemove(prop) {
+      let { id } = prop;
+      this.loading = true;
+      remove({ id })
+        .then((res) => {
+          let { code } = res;
+          if (code === 200) {
+            this.$message.success("success");
+          }
+        })
+        .finally(() => {
+          this.fetchList();
+          this.loading = false;
+        });
+    },
+
+    onChange(prop) {
+      let { prop: _prop, type: _type } = this.columns.find(
+        (item) => item.prop === prop
+      );
+      this.currentOption.prop = _prop;
+      this.currentOption.type = _type;
+    },
+
+    onSearch() {
+      this.page.pageNum = 1;
+      this.fetchList();
+    },
+
+    onSizeChange(prop) {
+      this.page.pageSize = prop;
+      this.fetchList();
+    },
+
+    onNumberChange(prop) {
+      this.page.pageNum = prop;
+      this.fetchList();
+    },
+
+    onAddLabel() {
+      console.log("this", this);
+      this.getAddDialogRef().dialogFormVisible = true;
+    },
+
+    onEditLabel(prop) {
+      // let { id } = prop;
+      // item({ id }).then((res) => {
+      //   let { code } = res;
+      //   if (code === 200) {
+      //     this.$message.success("success");
+      //   }
+      // });
+      console.log(prop);
+      this.getEditDialogRef().fetchItem(prop);
+    },
+
+    onLoad(tree, treeNode, resolve) {
+      setTimeout(() => {
+        resolve(tree.childrens);
+      }, 1000);
+    },
+
+    getAddDialogRef() {
+      return this.$parent.$children[1];
+    },
+
+    getEditDialogRef() {
+      return this.$parent.$children[2];
+    },
+  },
+  created() {
+    this.fetchList();
+  },
+};
+</script>
+
+<template>
+  <el-container class="material-label-table">
+    <el-header>
+      <div class="table-header-top">
+        <span>查询条件</span>
+        <div>
+          <div class="left">
+            <el-select
+              v-model="currentOption.prop"
+              size="small"
+              placeholder="请选择"
+              @change="onChange"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="center">
+            <el-select
+              v-if="currentOption.type === 'select'"
+              v-model="form[currentOption.prop]"
+              size="small"
+              placeholder="请选择"
+              @change="onChange"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+            <el-input
+              v-else
+              v-model="form[currentOption.prop]"
+              size="small"
+              placeholder="请输入内容"
+              suffix-icon="el-icon-search"
+              @change="onSearch"
+            >
+            </el-input>
+          </div>
+          <div class="right">
+            <el-button size="small">搜索</el-button>
+            <el-button size="small">重置</el-button>
+          </div>
+        </div>
+      </div>
+      <div class="table-header-bottom">
+        <el-button size="small" @click="onAddLabel">新增</el-button>
+        <el-button size="small">导入</el-button>
+        <!-- <el-button size="small">导出</el-button> -->
+      </div>
+    </el-header>
+    <el-main>
+      <el-table
+        v-loading="loading"
+        lazy
+        border
+        row-key="id"
+        :data="tableData"
+        :load="onLoad"
+        :tree-props="{ children: 'childrens', hasChildren: 'hasChildrens' }"
+      >
+        <el-table-column
+          v-for="column in columns"
+          :key="column.prop"
+          :prop="column.prop"
+          :label="column.label"
+          :show-overflow-tooltip="column.showOverflowTooltip"
+        >
+        </el-table-column>
+        <el-table-column fixed="right" label="操作" width="225">
+          <template slot-scope="scope">
+            <el-button
+              @click.native.prevent="onAuthTemplate(scope.row)"
+              size="small"
+            >
+              授权
+            </el-button>
+            <el-button
+              @click.native.prevent="onEditLabel(scope.row)"
+              size="small"
+            >
+              修改
+            </el-button>
+            <el-button
+              @click.native.prevent="fetchRemove(scope.row)"
+              size="small"
+            >
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-main>
+    <el-footer>
+      <el-pagination
+        @size-change="onSizeChange"
+        @current-change="onNumberChange"
+        :current-page="page.pageNum"
+        :page-sizes="[25, 50, 100]"
+        :page-size="page.pageSize"
+        layout="total, prev, pager, next, sizes, jumper"
+        :total="page.total"
+      >
+      </el-pagination>
+    </el-footer>
+  </el-container>
+</template>
+
+<style scoped>
+.material-label-table .el-header {
+  height: fit-content !important;
+  padding-top: var(--padding);
+  padding-bottom: var(--padding);
+  border-bottom: 1px solid #dcdfe6;
+}
+.material-label-table .table-header-top {
+  margin-bottom: var(--margin);
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.material-label-table .table-header-top > div {
+  display: flex;
+}
+.material-label-table .table-header-top .left {
+  width: 150px;
+  margin-right: var(--margin);
+}
+.material-label-table .table-header-top .center {
+  width: 250px;
+  margin-right: var(--margin);
+}
+.material-label-table .table-header-top .center > .el-input,
+.material-label-table .table-header-top .center > .el-select {
+  width: 100%;
+}
+.material-label-table .el-main {
+  padding: 0;
+}
+.material-label-table .el-main .el-table {
+  width: 100%;
+  height: 100%;
+}
+.material-label-table .el-footer {
+  display: flex;
+  justify-content: end;
+  align-items: center;
+}
+</style>

+ 0 - 0
src/views/material/label/lable-tree.vue → src/views/material/label/label-tree.vue


+ 0 - 170
src/views/material/label/lable-table.vue

@@ -1,170 +0,0 @@
-<script>
-export default {
-  name: "MaterialLabelTable",
-  data() {
-    return {
-      from: { input: "", select: "" },
-      options: [
-        {
-          value: "选项1",
-          label: "黄金糕",
-        },
-        {
-          value: "选项2",
-          label: "双皮奶",
-        },
-        {
-          value: "选项3",
-          label: "蚵仔煎",
-        },
-        {
-          value: "选项4",
-          label: "龙须面",
-        },
-        {
-          value: "选项5",
-          label: "北京烤鸭",
-        },
-      ],
-      tableData: [
-        {
-          date: "2016-05-022016-05-022016-05-022016-05-02",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1518 弄",
-        },
-        {
-          date: "2016-05-04",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1517 弄",
-        },
-        {
-          date: "2016-05-01",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1519 弄",
-        },
-        {
-          date: "2016-05-03",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1516 弄",
-        },
-      ],
-    };
-  },
-  methods: {
-    duanduan(value) {
-      this.$message(value + "duanduan");
-    },
-  },
-};
-</script>
-
-<template>
-  <el-container class="material-label-table">
-    <el-header>
-      <div class="table-header-top">
-        <span>查询条件</span>
-        <div>
-          <el-select v-model="from.select" size="small" placeholder="请选择">
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
-            </el-option>
-          </el-select>
-          <el-input
-            v-model="from.input"
-            size="small"
-            placeholder="请输入内容"
-            :readonly="isSearching"
-            @change="onSearch"
-          >
-            <template #suffix>
-              <i
-                v-show="isSearching"
-                class="el-input__icon el-icon-loading"
-              ></i>
-              <i
-                v-show="!isSearching"
-                class="el-input__icon el-icon-search"
-              ></i>
-            </template>
-          </el-input>
-          <el-button size="small">搜索</el-button>
-          <el-button size="small">重置</el-button>
-        </div>
-      </div>
-      <div class="table-header-bottom">
-        <el-button size="small">新增</el-button>
-        <el-button size="small">导入</el-button>
-        <el-button size="small">导出</el-button>
-      </div>
-    </el-header>
-    <el-main>
-      <el-table :data="tableData">
-        <el-table-column
-          type="selection"
-          width="55"
-          fixed="left"
-          align="center"
-          show-overflow-tooltip
-        >
-        </el-table-column>
-        <el-table-column prop="date" label="日期" show-overflow-tooltip>
-        </el-table-column>
-        <el-table-column prop="name" label="姓名" show-overflow-tooltip>
-        </el-table-column>
-        <el-table-column prop="address" label="地址" show-overflow-tooltip>
-        </el-table-column>
-      </el-table>
-    </el-main>
-    <el-footer>
-      <el-pagination
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        :current-page="currentPage4"
-        :page-sizes="[100, 200, 300, 400]"
-        :page-size="100"
-        layout="total, prev, pager, next, sizes, jumper"
-        :total="400"
-      >
-      </el-pagination>
-    </el-footer>
-  </el-container>
-</template>
-
-<style scoped>
-.material-label-table .el-header {
-  height: fit-content !important;
-  padding-top: var(--padding);
-  padding-bottom: var(--padding);
-  border-bottom: 1px solid #dcdfe6;
-}
-.material-label-table .table-header-top {
-  margin-bottom: var(--margin);
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-.material-label-table .table-header-top .el-select {
-  width: 150px;
-  margin-right: var(--margin);
-}
-.material-label-table .table-header-top .el-input {
-  width: 250px;
-  margin-right: var(--margin);
-}
-.material-label-table .el-main {
-  padding: 0;
-}
-.material-label-table .el-main .el-table {
-  width: 100%;
-  height: 100%;
-}
-.material-label-table .el-footer {
-  display: flex;
-  justify-content: end;
-  align-items: center;
-}
-</style>

文件差异内容过多而无法显示
+ 448 - 187
src/views/material/requisition/add.vue


+ 71 - 52
src/views/material/requisition/index.vue

@@ -3,43 +3,52 @@
     <div class="applyList" v-if="isList">
     <el-row :gutter="10" class="mb10">
       <el-col :span="1.5">
-
-        <el-select size="small" v-model="textValue" placeholder="请选择">
-        <el-option
-          v-for="item in text"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value">
-        </el-option>
-      </el-select>
-
-      <el-select size="small" v-model="ruleValue" placeholder="请选择">
-        <el-option
-          v-for="item in rule"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value">
-        </el-option>
-      </el-select>
-
-      <el-input
-        v-model="input"
-        size="small"
-        placeholder="请输入"
-        clearable
-        style="width: 240px"
-      />
-
+        <span style="font-size: 14px;margin-right: 5px;">单据编码</span>
+        <el-input
+          v-model="queryParams.billCode"
+          size="small"
+          placeholder="请输入单据编码查询"
+          clearable
+          style="width: 240px"
+        />
       </el-col>
 
       <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>查询</el-button>
+        <span style="font-size: 14px;margin-right: 5px;">物料名称</span>
+        <el-input
+          v-model="queryParams.name"
+          size="small"
+          placeholder="请输入物料名称查询"
+          clearable
+          style="width: 240px"
+        />
       </el-col>
+
       <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>高级查询</el-button>
+          <span style="font-size: 14px;margin-right: 5px;">单据状态</span>
+          <el-select 
+            v-model="queryParams.status"
+            size="small"
+            placeholder="请选择单据状态"
+            clearable
+            style="width: 240px">
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-col>
+
+      <el-col :span="1.5">
+        <el-button type="primary" size="small" plain @click="getList(queryParams)">查询</el-button>
       </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button type="primary" size="small" plain>高级查询</el-button>
+      </el-col> -->
       <el-col :span="1.5">
-        <el-button type="primary" size="small" plain>重置</el-button>
+        <el-button type="primary" size="small" plain @click="reset">重置</el-button>
       </el-col>
 
     </el-row>
@@ -48,12 +57,12 @@
       <el-col :span="1.5">
         <el-button type="primary" size="small" plain @click="newAdd">新增</el-button>
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button type="primary" size="small" plain>导入</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button type="primary" size="small" plain>导出</el-button>
-      </el-col>
+      </el-col> -->
       <!-- <el-col :span="1.5">
         <el-button type="primary" size="small" plain>批量提交</el-button>
       </el-col>
@@ -71,21 +80,17 @@
         @selection-change="handleSelectionChange"
       >
         <!-- <el-table-column type="selection" width="55" /> -->
-        <el-table-column label="序号" align="center" prop="sort" />
-        <el-table-column label="申请组织" align="center" prop="orgId" />
-        <el-table-column label="单据编码" align="center" width="200" prop="code" />
-        <el-table-column label="目的组织" align="center" prop="orgId" />
-        <el-table-column label="申请人" align="center" prop="createBy" />
-        <el-table-column label="申请时间" align="center" width="150" prop="applicationTime" />
+        <el-table-column label="序号" align="center" type="index" width="50"/>
+        <el-table-column label="申请组织" align="center" width="200" prop="orgName" />
+        <el-table-column label="单据编码" align="center" width="200" prop="billCode" />
+        <el-table-column label="申请人" align="center" prop="createName" />
+        <el-table-column label="申请时间" align="center" width="150" prop="createTime" />
         <el-table-column label="单据状态" align="center" prop="status" :formatter="statusJug" />
-        <el-table-column label="启用状态" align="center" prop="status" />
-        <el-table-column label="物料编码" align="center" width="150" prop="materialCode" />
-        <el-table-column label="物料名称" align="center" prop="materialName" />
-        <el-table-column label="最后审批人" align="center" width="120" prop="approver" />
-        <el-table-column label="最后审核时间" align="center" width="150" prop="approvalTime" />
-        <el-table-column label="创建人" align="center" prop="createBy" />
+        <!-- <el-table-column label="物料编码" align="center" width="150" prop="materialCode" /> -->
+        <el-table-column label="物料名称" align="center" width="150" prop="name" />
+        <el-table-column label="创建人" align="center" prop="createName"/>
         <el-table-column label="创建时间" align="center" width="150" prop="createTime" />
-        <el-table-column label="最后修改人" align="center" width="120" prop="updateBy" />
+        <el-table-column label="最后修改人" align="center" width="120" prop="updateName" />
         <el-table-column label="最后修改时间" align="center" width="150" prop="updateTime" />
         <el-table-column
           fixed="right"
@@ -95,8 +100,8 @@
           >
           <template slot-scope="scope">
             <el-button type="text" size="small" @click="check(scope.row)">查看</el-button>
-            <el-button @click="edit(scope.row)" v-if="scope.row.status == 0 || scope.row.status == 4" type="text" size="small">编辑</el-button>
-            <el-button type="text" size="small" @click="deleteRow(scope.row)">删除</el-button>
+            <el-button @click="edit(scope.row)" v-if="scope.row.status == 0 || scope.row.status == 3" type="text" size="small">编辑</el-button>
+            <el-button type="text" size="small" @click="deleteRow(scope.row)" v-if="scope.row.status == 0 || scope.row.status == 3">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -127,17 +132,24 @@ export default {
   },
   data() {
     return{
-      textValue: 1,
-      text: [{label: '文本字段', value: 1}, {label: '字典字段', value: 2}],
-      ruleValue: 1,
-      rule:[{label: '包含', value: 1}, {label: '不包含', value: 2}, {label: '等于', value: 3}, {label: '不等于', value: 4}],
-      input: '',
       // 
       tableList: [],
       queryParams: {
+        billCode: '',
+        name: '',
+        status: '',
         pageNum: 1,
         pageSize: 10
       },
+      options: [{
+        value: 0, label: '未提交'
+      },{
+        value: 1, label: '审批中'
+      },{
+        value: 2, label: '已完成'
+      },{
+        value: 3, label: '已驳回'
+      },],
       total:0,
       // isComponent
       isComponent:'addReq',
@@ -155,6 +167,13 @@ export default {
     this.getList(this.queryParams)
   },
   methods: {
+    reset() {
+      this.queryParams.billCode = ''
+      this.queryParams.name = ''
+      this.queryParams.status = ''
+      this.queryParams.pageNum = 1
+      this.getList(this.queryParams)
+    },
     newAdd() {
       this.isList = false
       this.isComponent = 'addReq'

+ 1 - 1
src/views/material/specialAttr/index.vue

@@ -348,7 +348,7 @@ export default {
     },
     filterNode(value, data) {
         if (!value) return true;
-        return data.label.indexOf(value) !== -1;
+        return data.materialType.indexOf(value) !== -1;
     },
     // 获取选中条目
     handleSelectionChange(val) { 

+ 1 - 1
src/views/register.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="register">
     <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
-      <h3 class="title">德荣供应链管理平台</h3>
+      <h3 class="title">德荣资源平台</h3>
       <el-form-item prop="username">
         <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />

+ 307 - 0
src/views/system/table-template/add-dialog.vue

@@ -0,0 +1,307 @@
+<script>
+import { item, add } from "@/api/system/table-template";
+export default {
+  name: "AddDialog",
+  data() {
+    const dict = {
+      status: [
+        { label: "启用", value: "0" },
+        { label: "停用", value: "2" },
+      ],
+    };
+    const columns = [
+      {
+        type: "text",
+        prop: "templateCode",
+        label: "模板编码",
+      },
+      {
+        type: "text",
+        prop: "templateName",
+        label: "模板名称",
+      },
+      {
+        type: "text",
+        prop: "desc",
+        label: "描述",
+      },
+      {
+        type: "text",
+        prop: "remark",
+        label: "备注",
+      },
+      {
+        type: "select",
+        prop: "status",
+        label: "启用状态",
+      },
+      {
+        type: "text",
+        prop: "createBy",
+        label: "创建者",
+        disabled: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "createTime",
+        label: "创建时间",
+        disabled: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "updateBy",
+        label: "更新者",
+        disabled: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "updateTime",
+        label: "更新时间",
+        disabled: true,
+        readonly: true,
+      },
+    ];
+    const initDict = () => dict;
+    const initColumns = () => columns;
+    const initForm = () => {
+      let form = { sysTemplateItemList: [] };
+      initColumns().forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      form: initForm(),
+      columns: initColumns(),
+      dict: initDict(),
+    };
+  },
+  methods: {
+    //
+    fetchItem(prop) {
+      let { id } = prop;
+      this.loading = true;
+      this.dialogFormVisible = true;
+      item(id)
+        .then((res) => {
+          let { data } = res;
+          this.form = data;
+          this.form.sysTemplateItemList = data.sysTemplateItemList.map(
+            (item) => ({
+              ...item,
+              isEdit: item.isEdit === "1" ? true : false,
+              isShow: item.isShow === "1" ? true : false,
+              isRequired: item.isRequired === "1" ? true : false,
+            })
+          );
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    //
+    onAddRow() {
+      this.form.sysTemplateItemList.push({
+        id: "",
+        isEdit: true,
+        isShow: true,
+        isRequired: true,
+      });
+    },
+    //
+    onMoveRow(index1, index2) {
+      let swapArr = (arr, index1, index2) => {
+        arr[index1] = arr.splice(index2, 1, arr[index1])[0];
+        return arr;
+      };
+      this.form.sysTemplateItemList = swapArr(
+        this.form.sysTemplateItemList,
+        index1 - 1,
+        index2
+      );
+    },
+    //
+    onRemoveRow(prop) {
+      let { code } = prop;
+      this.form.sysTemplateItemList = this.form.sysTemplateItemList.filter(
+        (item) => item.code !== code
+      );
+    },
+    //
+    onSubmit() {
+      this.loading = true;
+      this.form.id = "";
+      this.form.sysTemplateItemList = this.form.sysTemplateItemList.map(
+        (item, index) => ({
+          ...item,
+          id: "",
+          sort: String(index),
+          isEdit: item.isEdit === true ? "1" : "0",
+          isShow: item.isShow === true ? "1" : "0",
+          isRequired: item.isRequired === true ? "1" : "0",
+        })
+      );
+      add(this.form)
+        .then((res) => {
+          let { code } = res;
+          if (code == 200) {
+            this.dialogFormVisible = false;
+            this.$message.success("新增成功");
+            this.$parent.$children
+              .find((el) => el.$vnode.tag.indexOf("SearchTable") > -1)
+              .fetchList();
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <el-dialog
+    fullscreen
+    destroy-on-close
+    title="复制"
+    width="75%"
+    :visible.sync="dialogFormVisible"
+  >
+    <el-row v-loading="loading" :gutter="20">
+      <el-form size="mini" :model="form" label-position="top">
+        <el-col v-for="column in columns" :key="column.prop" :span="6">
+          <el-form-item :label="column.label">
+            <el-input
+              v-if="column.type === 'text'"
+              v-model="form[column.prop]"
+              :disabled="column.disabled"
+              :readonly="column.readonly"
+            ></el-input>
+            <el-select
+              v-if="column.type === 'select'"
+              v-model="form[column.prop]"
+              style="width: 100%"
+            >
+              <el-option label="启用" value="0"></el-option>
+              <el-option label="停用" value="2"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="模板配置">
+            <template #label>
+              <span style="margin-right: 12px">模板配置</span>
+              <el-button
+                @click.native.prevent="onAddRow"
+                icon="el-icon-plus"
+                circle
+              >
+              </el-button>
+            </template>
+            <el-table height="450" :data="form.sysTemplateItemList">
+              <el-table-column type="index" width="50"> </el-table-column>
+              <el-table-column prop="code" label="字段编码" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.code"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="name" label="字段名称" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.name"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="isEdit" label="是否编辑">
+                <template slot-scope="scope">
+                  <el-switch v-model="scope.row.isEdit"> </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column prop="isShow" label="是否显示">
+                <template slot-scope="scope">
+                  <el-switch v-model="scope.row.isShow"> </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column prop="isRequired" label="是否必填">
+                <template slot-scope="scope">
+                  <el-switch v-model="scope.row.isRequired"> </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="conditionType"
+                label="字段类型"
+                width="200"
+              >
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.conditionType"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="dictId" label="字典ID" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.dictId"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="textAttribute"
+                label="文本类型"
+                width="200"
+              >
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.textAttribute"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="checkRule" label="校验规则" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.checkRule"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column fixed="right" label="操作" width="150">
+                <template slot-scope="scope">
+                  <el-popover
+                    placement="left"
+                    width="200"
+                    trigger="click"
+                    style="margin-right: 8px"
+                  >
+                    <el-input-number
+                      v-model="scope.row.sort"
+                      controls-position="right"
+                      @change="onMoveRow($event, scope.$index)"
+                      :min="1"
+                      :max="form.sysTemplateItemList.length"
+                    ></el-input-number>
+                    <el-button
+                      slot="reference"
+                      icon="el-icon-watermelon"
+                      circle
+                    >
+                    </el-button>
+                  </el-popover>
+                  <el-button
+                    @click.native.prevent="onRemoveRow(scope.row)"
+                    icon="el-icon-remove"
+                    circle
+                  >
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-form-item>
+        </el-col>
+      </el-form>
+    </el-row>
+    <div slot="footer">
+      <el-button :disabled="loading" @click="dialogFormVisible = false"
+        >取 消</el-button
+      >
+      <el-button type="primary" :disabled="loading" @click="onSubmit"
+        >确 定</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<style scoped></style>

+ 94 - 0
src/views/system/table-template/auth-dialog.vue

@@ -0,0 +1,94 @@
+<script>
+import { role, auth } from "@/api/system/table-template";
+import { listRole } from "@/api/system/role";
+export default {
+  name: "AuthDialog",
+  data() {
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      form: { id: "" },
+      roleList: [],
+      authRoleList: [],
+    };
+  },
+  methods: {
+    //
+    fetchItem(prop) {
+      let { id } = prop;
+      this.form.id = id;
+      this.loading = true;
+      this.dialogFormVisible = true;
+      listRole({ id })
+        .then((res) => {
+          let { rows, total } = res;
+          this.roleList = rows.map((item) => ({
+            key: item.roleId,
+            label: item.roleName,
+          }));
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+      role(id)
+        .then((res) => {
+          let { data } = res;
+          this.authRoleList = data.map((item) => item.roleId);
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    //
+    onSubmit() {
+      auth({ templateId: this.form.id, roleIdList: this.authRoleList })
+        .then((res) => {
+          let { code } = res;
+          if (code == 200) {
+            this.dialogFormVisible = false;
+            this.$message.success("授权成功");
+            this.$parent.$children
+              .find((el) => el.$vnode.tag.indexOf("SearchTable") > -1)
+              .fetchList();
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <el-dialog
+    width="fit-content"
+    destroy-on-close
+    title="孙权"
+    :visible.sync="dialogFormVisible"
+  >
+    <el-transfer
+      v-loading="loading"
+      v-model="authRoleList"
+      :data="roleList"
+      :titles="['未授权', '已授权']"
+    >
+    </el-transfer>
+    <div slot="footer">
+      <el-button :disabled="loading" @click="dialogFormVisible = false"
+        >取 消</el-button
+      >
+      <el-button :disabled="loading" type="primary" @click="onSubmit"
+        >确 定
+      </el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<style scoped>
+.el-transfer .el-transfer-panel__footer {
+  display: flex;
+  align-items: center;
+}
+</style>

+ 318 - 0
src/views/system/table-template/edit-dialog.vue

@@ -0,0 +1,318 @@
+<script>
+import { item, edit } from "@/api/system/table-template";
+export default {
+  name: "EditDialog",
+  data() {
+    const dict = {
+      status: [
+        { label: "启用", value: "0" },
+        { label: "停用", value: "2" },
+      ],
+    };
+    const columns = [
+      {
+        type: "text",
+        prop: "templateCode",
+        label: "模板编码",
+      },
+      {
+        type: "text",
+        prop: "templateName",
+        label: "模板名称",
+      },
+      {
+        type: "text",
+        prop: "desc",
+        label: "描述",
+      },
+      {
+        type: "text",
+        prop: "remark",
+        label: "备注",
+      },
+      {
+        type: "select",
+        prop: "status",
+        label: "启用状态",
+      },
+      {
+        type: "text",
+        prop: "createBy",
+        label: "创建者",
+        disabled: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "createTime",
+        label: "创建时间",
+        disabled: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "updateBy",
+        label: "更新者",
+        disabled: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "updateTime",
+        label: "更新时间",
+        disabled: true,
+        readonly: true,
+      },
+    ];
+    const initDict = () => dict;
+    const initColumns = () => columns;
+    const initForm = () => {
+      let form = { sysTemplateItemList: [] };
+      initColumns().forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    return {
+      loading: false,
+      dialogFormVisible: false,
+      form: initForm(),
+      columns: initColumns(),
+      dict: initDict(),
+    };
+  },
+  methods: {
+    //
+    fetchItem(prop) {
+      let { id } = prop;
+      this.loading = true;
+      this.dialogFormVisible = true;
+      item(id)
+        .then((res) => {
+          let { data } = res;
+          this.form = data;
+          this.form.sysTemplateItemList = data.sysTemplateItemList.map(
+            (item) => ({
+              ...item,
+              isEdit: item.isEdit === "1" ? true : false,
+              isShow: item.isShow === "1" ? true : false,
+              isRequired: item.isRequired === "1" ? true : false,
+            })
+          );
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    //
+    onAddRow() {
+      this.form.sysTemplateItemList.push({
+        id: "",
+        isEdit: true,
+        isShow: true,
+        isRequired: true,
+      });
+    },
+    //
+    onMoveRow(index1, index2) {
+      let swapArr = (arr, index1, index2) => {
+        arr[index1] = arr.splice(index2, 1, arr[index1])[0];
+        return arr;
+      };
+      this.form.sysTemplateItemList = swapArr(
+        this.form.sysTemplateItemList,
+        index1 - 1,
+        index2
+      );
+    },
+    //
+    onRemoveRow(prop) {
+      let { code } = prop;
+      this.form.sysTemplateItemList = this.form.sysTemplateItemList.filter(
+        (item) => item.code !== code
+      );
+    },
+    //
+    onSubmit() {
+      this.loading = true;
+      this.form.sysTemplateItemList = this.form.sysTemplateItemList.map(
+        (item, index) => ({
+          ...item,
+          id: "",
+          sort: String(index),
+          isEdit: item.isEdit === true ? "1" : "0",
+          isShow: item.isShow === true ? "1" : "0",
+          isRequired: item.isRequired === true ? "1" : "0",
+        })
+      );
+      edit(this.form)
+        .then((res) => {
+          let { code } = res;
+          if (code == 200) {
+            this.dialogFormVisible = false;
+            this.$message.success("更新成功");
+            this.$parent.$children
+              .find((el) => el.$vnode.tag.indexOf("SearchTable") > -1)
+              .fetchList();
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <el-dialog
+    fullscreen
+    destroy-on-close
+    title="编辑"
+    width="75%"
+    :visible.sync="dialogFormVisible"
+  >
+    <el-row v-loading="loading" :gutter="20">
+      <el-form size="mini" :model="form" label-position="top">
+        <el-col v-for="column in columns" :key="column.prop" :span="6">
+          <el-form-item :label="column.label">
+            <el-input
+              v-if="column.type === 'text'"
+              v-model="form[column.prop]"
+              :disabled="column.disabled"
+              :readonly="column.readonly"
+            ></el-input>
+            <el-select
+              v-if="column.type === 'select'"
+              v-model="form[column.prop]"
+              style="width: 100%"
+            >
+              <el-option label="启用" value="0"></el-option>
+              <el-option label="停用" value="2"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="模板配置">
+            <template #label>
+              <span style="margin-right: 12px">模板配置</span>
+              <el-button
+                @click.native.prevent="onAddRow"
+                icon="el-icon-plus"
+                circle
+              >
+              </el-button>
+            </template>
+            <el-table height="450" :data="form.sysTemplateItemList">
+              <el-table-column type="index" width="50"> </el-table-column>
+              <el-table-column prop="code" label="字段编码" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.code"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="name" label="字段名称" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.name"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="isEdit" label="是否编辑">
+                <template slot-scope="scope">
+                  <el-switch v-model="scope.row.isEdit"> </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column prop="isShow" label="是否显示">
+                <template slot-scope="scope">
+                  <el-switch v-model="scope.row.isShow"> </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column prop="isRequired" label="是否必填">
+                <template slot-scope="scope">
+                  <el-switch v-model="scope.row.isRequired"> </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="conditionType"
+                label="字段类型"
+                width="200"
+              >
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.conditionType"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="dictId" label="字典ID" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.dictId"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="textAttribute"
+                label="文本类型"
+                width="200"
+              >
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.textAttribute"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="checkRule" label="校验规则" width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.checkRule"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column fixed="right" label="操作" width="150">
+                <template slot-scope="scope">
+                  <el-popover
+                    placement="left"
+                    width="200"
+                    trigger="click"
+                    style="margin-right: 8px"
+                  >
+                    <el-input-number
+                      v-model="scope.row.sort"
+                      controls-position="right"
+                      @change="onMoveRow($event, scope.$index)"
+                      :min="1"
+                      :max="form.sysTemplateItemList.length"
+                    ></el-input-number>
+                    <el-button
+                      slot="reference"
+                      icon="el-icon-watermelon"
+                      circle
+                    >
+                    </el-button>
+                  </el-popover>
+                  <el-button
+                    @click.native.prevent="onRemoveRow(scope.row)"
+                    icon="el-icon-remove"
+                    circle
+                  >
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-form-item>
+        </el-col>
+      </el-form>
+    </el-row>
+    <div slot="footer">
+      <el-button :disabled="loading" @click="dialogFormVisible = false"
+        >取 消</el-button
+      >
+      <el-button type="primary" :disabled="loading" @click="onSubmit"
+        >确 定</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<style>
+.el-dialog.is-fullscreen {
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+}
+
+.el-dialog.is-fullscreen .el-dialog__body {
+  flex: 1;
+  overflow-y: auto;
+}
+</style>

+ 20 - 499
src/views/system/table-template/index.vue

@@ -1,470 +1,31 @@
 <script>
-// import LabelTree from "./lable-tree.vue";
-// import TemplateTable from "./template-table.vue";
-import { list, item, role, auth } from "@/api/system/table-template";
-import { listRole } from "@/api/system/role";
+import AddDialog from "./add-dialog.vue";
+import EditDialog from "./edit-dialog.vue";
+import AuthDialog from "./auth-dialog.vue";
+import SearchTable from "./search-table.vue";
 export default {
   name: "TableTemplate",
   components: {
-    // LabelTree,
-    // TemplateTable,
+    AddDialog,
+    EditDialog,
+    AuthDialog,
+    SearchTable,
   },
   data() {
-    return {
-      loading: false,
-      // 详情弹窗标题
-      itemDialogTitle: "",
-      // 详情弹窗显隐
-      itemDialogVisible: false,
-      // 授权弹窗显隐
-      authDialogVisible: false,
-      // 授权查询参数
-      authQueryParams: { id: "", pageNum: 1, pageSize: 10 },
-      // 角色列表
-      roleList: [],
-      // 角色总数
-      roleTotal: 0,
-      // 已授权角色列表,
-      authRoleList: [],
-
-      form1: { input: "", select: "" },
-      form2: { input: "", select: "" },
-      page: { pageNum: 1, pageSize: 25 },
-      total: 0,
-      options: [],
-      tableData: [],
-      selectionTableData: [],
-      columns: [
-        {
-          type: "text",
-          prop: "templateCode",
-          label: "模板编码",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "text",
-          prop: "templateName",
-          label: "模板名称",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "text",
-          prop: "desc",
-          label: "描述",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "text",
-          prop: "remark",
-          label: "备注",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "select",
-          prop: "status",
-          label: "启用状态",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "text",
-          prop: "createBy",
-          label: "创建者",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "text",
-          prop: "createTime",
-          label: "创建时间",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "text",
-          prop: "updateBy",
-          label: "更新者",
-          showOverflowTooltip: true,
-        },
-        {
-          type: "text",
-          prop: "updateTime",
-          label: "更新时间",
-          showOverflowTooltip: true,
-        },
-      ],
-    };
-  },
-  methods: {
-    // 搜索模板列表
-    fetchList() {
-      list(this.from, this.page).then((res) => {
-        let { total, rows } = res;
-        this.tableData = rows;
-        this.total = total;
-      });
-    },
-    // 查询模板列表
-    onSearch() {
-      this.pageNum = 1;
-      this.fetchList();
-    },
-    //
-    onSizeChnage() {
-      this.pageNum = 1;
-      this.fetchList();
-    },
-    //
-    onCurrentChange() {
-      this.fetchList();
-    },
-    // 选择待复制模板
-    onSelectionChange(value) {
-      this.selectionTableData = value;
-    },
-    // 打开授权弹窗
-    onAuthTemplate(props) {
-      let { id } = props;
-      this.authDialogVisible = true;
-      this.authQueryParams.id = id;
-      listRole(this.authQueryParams).then((res) => {
-        let { rows, total } = res;
-        this.roleList = rows.map((item) => ({
-          key: item.roleId,
-          label: item.roleName,
-        }));
-        this.roleTotal = total;
-      });
-      role(id).then((res) => {
-        let { data } = res;
-        this.authRoleList = data.map((item) => item.roleId);
-      });
-    },
-    // 打开编辑弹窗
-    onEditTemplate(props) {
-      this.itemDialogTitle = "编辑";
-      this.itemDialogVisible = true;
-      let { id } = props;
-      item(id).then((res) => {
-        let { data } = res;
-        this.form2 = data;
-        this.form2.sysTemplateItemList = data.sysTemplateItemList.map(
-          (item) => ({
-            ...item,
-            isEdit: item.isEdit === "1" ? true : false,
-            isShow: item.isShow === "1" ? true : false,
-            isRequired: item.isRequired === "1" ? true : false,
-          })
-        );
-      });
-    },
-    // 提交授权
-    onSubmitAuth() {
-      let templateId = this.authQueryParams.id;
-      let roleIdList = this.authRoleList;
-      auth({ templateId, roleIdList }).then((res) => {
-        let { code } = res;
-        if (code == 200) {
-          this.authDialogVisible = false;
-          this.$message.success("授权成功");
-        }
-      });
-    },
-    // 复制编辑模板
-    onCopyTemplate(props) {
-      this.itemDialogTitle = "复制";
-      this.itemDialogVisible = true;
-      let { id } = props;
-      item(id).then((res) => {
-        let { data } = res;
-        this.form2 = data;
-        this.form2.sysTemplateItemList = data.sysTemplateItemList.map(
-          (item) => ({
-            ...item,
-            isEdit: item.isEdit === "1" ? true : false,
-            isShow: item.isShow === "1" ? true : false,
-            isRequired: item.isRequired === "1" ? true : false,
-          })
-        );
-      });
-    },
-
-    // 删除模板row
-    onRemoveTemplateRow(props) {
-      let { code } = props;
-      this.form2.sysTemplateItemList = this.form2.sysTemplateItemList.filter(
-        (item) => item.code !== code
-      );
-    },
-    // 移动模板row
-    onMoveTemplateRow(direction, index1) {
-      let index2 = 0;
-      let swapArr = (arr, index1, index2) => {
-        arr[index1] = arr.splice(index2, 1, arr[index1])[0];
-        return arr;
-      };
-      index2 = direction === "top" ? index1 - 1 : index1 + 1;
-      this.form2.sysTemplateItemList = swapArr(
-        this.form2.sysTemplateItemList,
-        index1,
-        index2
-      );
-    },
+    return {};
   },
+  methods: {},
 
-  created() {
-    this.fetchList();
-  },
+  created() {},
 };
 </script>
 
 <template>
   <el-container class="container table-template">
-    <el-container class="table-template-table">
-      <el-header>
-        <div class="table-header-top">
-          <span>查询条件</span>
-          <div>
-            <el-select v-model="form1.select" size="small" placeholder="请选择">
-              <el-option
-                v-for="item in options"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              >
-              </el-option>
-            </el-select>
-            <el-input
-              v-model="form1.input"
-              size="small"
-              placeholder="请输入内容"
-              :readonly="loading"
-              @change="onSearch"
-            >
-              <template #suffix>
-                <i v-show="loading" class="el-input__icon el-icon-loading"></i>
-                <i v-show="!loading" class="el-input__icon el-icon-search"></i>
-              </template>
-            </el-input>
-            <el-button size="small">搜索</el-button>
-            <el-button size="small">重置</el-button>
-          </div>
-        </div>
-        <div class="table-header-bottom">
-          <el-button size="small">新增</el-button>
-          <el-button
-            size="small"
-            :disabled="selectionTableData.length !== 1"
-            @click="onCopyTemplate(selectionTableData[0])"
-            >复制</el-button
-          >
-          <el-button size="small">导入</el-button>
-          <el-button size="small">导出</el-button>
-        </div>
-      </el-header>
-      <el-main>
-        <el-table :data="tableData" @selection-change="onSelectionChange">
-          <el-table-column
-            type="selection"
-            width="55"
-            fixed="left"
-            align="center"
-            show-overflow-tooltip
-          >
-          </el-table-column>
-          <el-table-column
-            v-for="column in columns"
-            :key="column.prop"
-            :prop="column.prop"
-            :label="column.label"
-            :show-overflow-tooltip="column.showOverflowTooltip"
-          >
-          </el-table-column>
-          <el-table-column fixed="right" label="操作" width="225">
-            <template slot-scope="scope">
-              <el-button
-                @click.native.prevent="onAuthTemplate(scope.row)"
-                size="small"
-              >
-                授权
-              </el-button>
-              <el-button
-                @click.native.prevent="onEditTemplate(scope.row)"
-                size="small"
-              >
-                修改
-              </el-button>
-              <el-button
-                @click.native.prevent="deleteRow(scope.$index, tableData)"
-                size="small"
-              >
-                删除
-              </el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-      </el-main>
-      <el-footer>
-        <el-pagination
-          @size-change="onSizeChnage"
-          @current-change="onCurrentChange"
-          :current-page="page.pageNum"
-          :page-sizes="[25, 50, 100]"
-          :page-size="page.pageSize"
-          layout="total, prev, pager, next, sizes, jumper"
-          :total="total"
-        >
-        </el-pagination>
-      </el-footer>
-    </el-container>
-    <el-dialog
-      width="75%"
-      destroy-on-close
-      :title="itemDialogTitle"
-      :visible.sync="itemDialogVisible"
-    >
-      <el-row :gutter="20">
-        <el-form size="mini" :model="form2" label-position="top">
-          <el-col v-for="column in columns" :key="column.prop" :span="6">
-            <el-form-item :label="column.label">
-              <el-input
-                v-if="column.type === 'text'"
-                v-model="form2[column.prop]"
-              ></el-input>
-              <el-select
-                v-if="column.type === 'select'"
-                v-model="form2[column.prop]"
-              >
-                <el-option label="区域一" value="shanghai"></el-option>
-                <el-option label="区域二" value="beijing"></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="模板配置">
-              <el-table :data="form2.sysTemplateItemList">
-                <el-table-column type="index" width="50"> </el-table-column>
-                <el-table-column prop="code" label="字段编码" width="200">
-                  <template slot-scope="scope">
-                    <el-input v-model="scope.row.code"></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="name" label="字段名称" width="200">
-                  <template slot-scope="scope">
-                    <el-input v-model="scope.row.name"></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="isEdit" label="是否编辑">
-                  <template slot-scope="scope">
-                    <el-switch v-model="scope.row.isEdit"> </el-switch>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="isShow" label="是否显示">
-                  <template slot-scope="scope">
-                    <el-switch v-model="scope.row.isShow"> </el-switch>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="isRequired" label="是否必填">
-                  <template slot-scope="scope">
-                    <el-switch v-model="scope.row.isRequired"> </el-switch>
-                  </template>
-                </el-table-column>
-                <el-table-column
-                  prop="conditionType"
-                  label="字段类型"
-                  width="200"
-                >
-                  <template slot-scope="scope">
-                    <el-input v-model="scope.row.conditionType"></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="dictId" label="字典ID" width="200">
-                  <template slot-scope="scope">
-                    <el-input v-model="scope.row.dictId"></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column
-                  prop="textAttribute"
-                  label="文本类型"
-                  width="200"
-                >
-                  <template slot-scope="scope">
-                    <el-input v-model="scope.row.textAttribute"></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="checkRule" label="校验规则" width="200">
-                  <template slot-scope="scope">
-                    <el-input v-model="scope.row.checkRule"></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column fixed="right" label="操作" width="150">
-                  <template slot-scope="scope">
-                    <el-button
-                      :disabled="scope.$index === 0"
-                      @click.native.prevent="
-                        onMoveTemplateRow('top', scope.$index)
-                      "
-                      icon="el-icon-top"
-                      circle
-                    >
-                    </el-button>
-                    <el-button
-                      :disabled="
-                        scope.$index === form2.sysTemplateItemList.length - 1
-                      "
-                      @click.native.prevent="
-                        onMoveTemplateRow('bottom', scope.$index)
-                      "
-                      icon="el-icon-bottom"
-                      circle
-                    >
-                    </el-button>
-                    <el-button
-                      @click.native.prevent="onRemoveTemplateRow(scope.row)"
-                      icon="el-icon-remove"
-                      circle
-                    >
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-            </el-form-item>
-          </el-col>
-          <!-- <el-col :span="12">
-            <el-form-item label="活动区域">
-              <el-select v-model="form2.region" placeholder="请选择活动区域">
-                <el-option label="区域一" value="shanghai"></el-option>
-                <el-option label="区域二" value="beijing"></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col> -->
-        </el-form>
-      </el-row>
-      <div slot="footer">
-        <el-button @click="itemDialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="itemDialogVisible = false"
-          >确 定</el-button
-        >
-      </div>
-    </el-dialog>
-    <el-dialog
-      width="fit-content"
-      destroy-on-close
-      title="君权孙授"
-      :visible.sync="authDialogVisible"
-    >
-      <el-transfer
-        v-model="authRoleList"
-        :data="roleList"
-        :titles="['未授权', '已授权']"
-      >
-        <template #left-footer>
-          <el-pagination :total="roleTotal" layout="prev, pager, next">
-          </el-pagination>
-        </template>
-      </el-transfer>
-      <div slot="footer">
-        <el-button @click="authDialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="onSubmitAuth">确 定 </el-button>
-      </div>
-    </el-dialog>
+    <search-table></search-table>
+    <add-dialog></add-dialog>
+    <edit-dialog></edit-dialog>
+    <auth-dialog></auth-dialog>
   </el-container>
 </template>
 
@@ -475,52 +36,12 @@ export default {
   --padding: var(--size);
 }
 .container {
-  width: calc(100% - calc(var(--size) * 2));
-  /* height: calc(100vh - calc(var(--size) * 2)); */
-  margin: var(--padding);
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
-}
-.container .el-aside {
-  margin: 0;
-  padding: var(--padding);
-  background-color: rgba(255, 255, 255, 1);
-  border-right: 1px solid #dcdfe6;
-  overflow: hidden;
-}
-.table-template-table .el-header {
-  height: fit-content !important;
-  padding-top: var(--padding);
-  padding-bottom: var(--padding);
-  border-bottom: 1px solid #dcdfe6;
-}
-.table-template-table .table-header-top {
-  margin-bottom: var(--margin);
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-.table-template-table .table-header-top .el-select {
-  width: 150px;
-  margin-right: var(--margin);
-}
-.table-template-table .table-header-top .el-input {
-  width: 250px;
-  margin-right: var(--margin);
-}
-.table-template-table .el-main {
-  padding: 0;
-}
-.table-template-table .el-main .el-table {
   width: 100%;
-  height: 100%;
-}
-.table-template-table .el-footer {
-  display: flex;
-  justify-content: end;
-  align-items: center;
+  height: calc(100vh - 50px);
+  margin-right: var(--padding);
 }
-.el-transfer .el-transfer-panel__footer {
-  display: flex;
-  align-items: center;
+.hasTagsView .container {
+  height: calc(100vh - 84px);
+  overflow: hidden;
 }
 </style>

+ 298 - 0
src/views/system/table-template/search-table.vue

@@ -0,0 +1,298 @@
+<script>
+import { list, remove } from "@/api/system/table-template";
+export default {
+  name: "SearchTable",
+  data() {
+    const dict = {
+      status: [
+        { label: "启用", value: "0" },
+        { label: "停用", value: "2" },
+      ],
+    };
+    const columns = [
+      {
+        type: "text",
+        prop: "templateCode",
+        label: "模板编码",
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "templateName",
+        label: "模板名称",
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "desc",
+        label: "描述",
+        showOverflowTooltip: true,
+      },
+      {
+        type: "text",
+        prop: "remark",
+        label: "备注",
+        showOverflowTooltip: true,
+      },
+      {
+        type: "select",
+        prop: "status",
+        label: "启用状态",
+        showOverflowTooltip: true,
+        formatter: true,
+      },
+      {
+        type: "text",
+        prop: "createBy",
+        label: "创建者",
+        showOverflowTooltip: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "createTime",
+        label: "创建时间",
+        showOverflowTooltip: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "updateBy",
+        label: "更新者",
+        showOverflowTooltip: true,
+        readonly: true,
+      },
+      {
+        type: "text",
+        prop: "updateTime",
+        label: "更新时间",
+        showOverflowTooltip: true,
+        readonly: true,
+      },
+    ];
+    const initDict = () => dict;
+    const initColumns = () => columns;
+    const initOptions = () =>
+      initColumns().map((item) => ({ label: item.label, value: item.prop }));
+    const initForm = () => {
+      let form = {};
+      initColumns().forEach((item) => (form[item.prop] = ""));
+      return form;
+    };
+    return {
+      loading: false,
+      dict: initDict(),
+      columns: initColumns(),
+      form: initForm(),
+      options: initOptions(),
+      tableData: [],
+      currentData: {},
+      page: { pageNum: 1, pageSize: 25 },
+      total: 0,
+    };
+  },
+  methods: {
+    //
+    formatter({ row, column: { property } }) {
+      return this.dict[property].find((item) => item.value === row[property])
+        .label;
+    },
+    // 请求
+    fetchList() {
+      this.loading = true;
+      list(this.from, this.page)
+        .then((res) => {
+          let { code, total, rows } = res;
+          if (code === 200) {
+            this.total = total;
+            this.tableData = rows;
+            this.currentData = rows[0];
+            this.$message.success("查询成功");
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    // 搜索
+    handleSearch() {
+      this.pageNum = 1;
+      this.fetchList();
+    },
+    // 重置
+    handleReset() {
+      this.pageNum = 1;
+      this.pageSize = 25;
+      this.fetchList();
+    },
+    // 个数
+    handleSize() {
+      this.pageNum = 1;
+      this.fetchList();
+    },
+    // 页数
+    handleCurrent() {
+      this.fetchList();
+    },
+    // 高亮
+    handleRowClass({ row }) {
+      if (row.id === this.currentData.id) return "current-row";
+    },
+    // 选择
+    handleCurrentRowSelect(row) {
+      this.currentData = row;
+    },
+    // 复制
+    handleCopy(prop) {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("AddDialog") > -1)
+        .fetchItem(prop);
+    },
+    // 编辑
+    handleEdit(prop) {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("EditDialog") > -1)
+        .fetchItem(prop);
+    },
+    // 授权
+    handleAuth(prop) {
+      this.$parent.$children
+        .find((el) => el.$vnode.tag.indexOf("AuthDialog") > -1)
+        .fetchItem(prop);
+    },
+    // 删除
+    handleDelete(prop) {
+      this.loading = true;
+      remove(prop.id)
+        .then((res) => {
+          let { code } = res;
+          if (code === 200) {
+            this.fetchList();
+            this.$message.success("删除成功");
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+  created() {
+    this.handleSearch();
+  },
+};
+</script>
+
+<template>
+  <el-container class="table-template">
+    <el-header>
+      <div>
+        <el-button @click.native.prevent="handleCopy(currentData)" size="small">
+          复制
+        </el-button>
+        <el-button @click.native.prevent="handleEdit(currentData)" size="small">
+          修改
+        </el-button>
+        <el-button @click.native.prevent="handleAuth(currentData)" size="small">
+          授权
+        </el-button>
+        <el-button
+          @click.native.prevent="handleDelete(currentData)"
+          size="small"
+        >
+          删除
+        </el-button>
+      </div>
+      <div>
+        <el-select v-model="form.select" size="small" placeholder="请选择">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+        <el-input
+          v-model="form.input"
+          size="small"
+          placeholder="请输入内容"
+          :readonly="loading"
+        >
+          <template #suffix>
+            <i v-show="loading" class="el-input__icon el-icon-loading"></i>
+            <i v-show="!loading" class="el-input__icon el-icon-search"></i>
+          </template>
+        </el-input>
+        <el-button size="small" @click="handleSearch">搜索</el-button>
+        <el-button size="small" @click="handleReset">重置</el-button>
+      </div>
+    </el-header>
+    <el-main>
+      <el-table
+        v-loading="loading"
+        highlight-current-row
+        height="100%"
+        :data="tableData"
+        @row-click="handleCurrentRowSelect"
+        :row-class-name="handleRowClass"
+      >
+        <el-table-column type="index" width="50"> </el-table-column>
+        <el-table-column
+          width="200"
+          v-for="column in columns"
+          :key="column.prop"
+          :prop="column.prop"
+          :label="column.label"
+          :show-overflow-tooltip="column.showOverflowTooltip"
+        >
+          <template slot-scope="scope">
+            <span v-if="column.formatter">{{ formatter(scope) }}</span>
+            <span v-else>{{ scope.row[column.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-main>
+    <el-footer>
+      <el-pagination
+        @size-change="handleSize"
+        @current-change="handleCurrent"
+        :current-page="page.pageNum"
+        :page-sizes="[25, 50, 100]"
+        :page-size="page.pageSize"
+        layout="total, prev, pager, next, sizes, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </el-footer>
+  </el-container>
+</template>
+
+<style scoped>
+.table-template .el-header {
+  border-bottom: 1px solid #dcdfe6;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.table-template .el-header .el-select {
+  width: 150px;
+  margin-right: var(--margin);
+}
+.table-template .el-header .el-input {
+  width: 250px;
+  margin-right: var(--margin);
+}
+.table-template .el-main {
+  padding: 0;
+}
+.table-template .el-main .el-table {
+  width: 100%;
+  height: 100%;
+}
+.table-template .el-footer {
+  display: flex;
+  justify-content: end;
+  align-items: center;
+}
+</style>

+ 0 - 171
src/views/system/table-template/template-table.vue

@@ -1,171 +0,0 @@
-<script>
-import { list, item } from "@/api/system/table-template";
-export default {
-  name: "TableTemplateTable",
-  data() {
-    return {
-      from: { input: "", select: "" },
-      options: [
-        {
-          value: "选项1",
-          label: "黄金糕",
-        },
-        {
-          value: "选项2",
-          label: "双皮奶",
-        },
-        {
-          value: "选项3",
-          label: "蚵仔煎",
-        },
-        {
-          value: "选项4",
-          label: "龙须面",
-        },
-        {
-          value: "选项5",
-          label: "北京烤鸭",
-        },
-      ],
-      tableData: [
-        {
-          date: "2016-05-022016-05-022016-05-022016-05-02",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1518 弄",
-        },
-        {
-          date: "2016-05-04",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1517 弄",
-        },
-        {
-          date: "2016-05-01",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1519 弄",
-        },
-        {
-          date: "2016-05-03",
-          name: "王小虎",
-          address: "上海市普陀区金沙江路 1516 弄",
-        },
-      ],
-    };
-  },
-  methods: {
-    duanduan(value) {
-      this.$message(value + "duanduan");
-    },
-  },
-};
-</script>
-
-<template>
-  <el-container class="table-template-table">
-    <el-header>
-      <div class="table-header-top">
-        <span>查询条件</span>
-        <div>
-          <el-select v-model="from.select" size="small" placeholder="请选择">
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
-            </el-option>
-          </el-select>
-          <el-input
-            v-model="from.input"
-            size="small"
-            placeholder="请输入内容"
-            :readonly="isSearching"
-            @change="onSearch"
-          >
-            <template #suffix>
-              <i
-                v-show="isSearching"
-                class="el-input__icon el-icon-loading"
-              ></i>
-              <i
-                v-show="!isSearching"
-                class="el-input__icon el-icon-search"
-              ></i>
-            </template>
-          </el-input>
-          <el-button size="small">搜索</el-button>
-          <el-button size="small">重置</el-button>
-        </div>
-      </div>
-      <div class="table-header-bottom">
-        <el-button size="small">新增</el-button>
-        <el-button size="small">导入</el-button>
-        <el-button size="small">导出</el-button>
-      </div>
-    </el-header>
-    <el-main>
-      <el-table :data="tableData">
-        <el-table-column
-          type="selection"
-          width="55"
-          fixed="left"
-          align="center"
-          show-overflow-tooltip
-        >
-        </el-table-column>
-        <el-table-column prop="date" label="日期" show-overflow-tooltip>
-        </el-table-column>
-        <el-table-column prop="name" label="姓名" show-overflow-tooltip>
-        </el-table-column>
-        <el-table-column prop="address" label="地址" show-overflow-tooltip>
-        </el-table-column>
-      </el-table>
-    </el-main>
-    <el-footer>
-      <el-pagination
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        :current-page="currentPage4"
-        :page-sizes="[100, 200, 300, 400]"
-        :page-size="100"
-        layout="total, prev, pager, next, sizes, jumper"
-        :total="400"
-      >
-      </el-pagination>
-    </el-footer>
-  </el-container>
-</template>
-
-<style scoped>
-.table-template-table .el-header {
-  height: fit-content !important;
-  padding-top: var(--padding);
-  padding-bottom: var(--padding);
-  border-bottom: 1px solid #dcdfe6;
-}
-.table-template-table .table-header-top {
-  margin-bottom: var(--margin);
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-.table-template-table .table-header-top .el-select {
-  width: 150px;
-  margin-right: var(--margin);
-}
-.table-template-table .table-header-top .el-input {
-  width: 250px;
-  margin-right: var(--margin);
-}
-.table-template-table .el-main {
-  padding: 0;
-}
-.table-template-table .el-main .el-table {
-  width: 100%;
-  height: 100%;
-}
-.table-template-table .el-footer {
-  display: flex;
-  justify-content: end;
-  align-items: center;
-}
-</style>

+ 2 - 2
src/views/system/user/index.vue

@@ -476,9 +476,9 @@ export default {
         }
       );
     },
-    /** 查询部门下拉树结构 */
+    /** 查询部门下拉树结构 status:0过滤屌树形里停用的*/
     getDeptTree() {
-      deptTreeSelect().then(response => {
+      deptTreeSelect({status: 0}).then(response => {
         this.deptOptions = response.data;
       });
     },

+ 33 - 27
vue.config.js

@@ -36,8 +36,14 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        // target: `http://172.16.100.107:8080/ruoyi-admin`, //生产
-        target: ` http://172.16.13.77:8000/ruoyi-admin`, //本地
+        // target: `http://172.16.100.107:8080/drp-admin`, //测试
+        target: `http://test-sy.derom.com/drp-admin`, //测试
+        // target: `http://sy.derom.com/drp-admin`, //生产
+        // target: `http://172.16.63.202:8000/drp-admin`, // D本地
+        // target: `http://172.16.62.241:8000/drp-admin`, //笑寒本地
+        // target: `http://172.16.13.152:8000/drp-admin`, //豪哥本地
+        // target: `http://172.16.13.47:8000/drp-admin`, //石杨本地
+        // target: `http://172.16.13.113:8000/drp-admin`, //DWT本地
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''
@@ -105,33 +111,33 @@ module.exports = {
             .end()
           config
             .optimization.splitChunks({
-            chunks: 'all',
-            cacheGroups: {
-              libs: {
-                name: 'chunk-libs',
-                test: /[\\/]node_modules[\\/]/,
-                priority: 10,
-                chunks: 'initial' // only package third parties that are initially dependent
-              },
-              elementUI: {
-                name: 'chunk-elementUI', // split elementUI into a single package
-                priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
-                test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
-              },
-              commons: {
-                name: 'chunk-commons',
-                test: resolve('src/components'), // can customize your rules
-                minChunks: 3, //  minimum common number
-                priority: 5,
-                reuseExistingChunk: true
+              chunks: 'all',
+              cacheGroups: {
+                libs: {
+                  name: 'chunk-libs',
+                  test: /[\\/]node_modules[\\/]/,
+                  priority: 10,
+                  chunks: 'initial' // only package third parties that are initially dependent
+                },
+                elementUI: {
+                  name: 'chunk-elementUI', // split elementUI into a single package
+                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+                },
+                commons: {
+                  name: 'chunk-commons',
+                  test: resolve('src/components'), // can customize your rules
+                  minChunks: 3, //  minimum common number
+                  priority: 5,
+                  reuseExistingChunk: true
+                }
               }
-            }
-          })
+            })
           config.optimization.runtimeChunk('single'),
-            {
-              from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
-              to: './' //到根目录下
-            }
+          {
+            from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
+            to: './' //到根目录下
+          }
         }
       )
   }

部分文件因为文件数量过多而无法显示