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

1.新增资产下单页面
2.新增下单页面权限控制

GouGengquan 1 місяць тому
батько
коміт
3814484ff5

+ 5 - 0
src/api/assets.js

@@ -8,4 +8,9 @@ export function getAssetsTodoList(params) {
 // 获取资产待办任务详情
 export function getAssetsTodoDetail(params) {
     return request.get(`assets/getAssetsDetailById/${params}`)
+}
+
+// 资产业务订单新增
+export function add(params) {
+    return request.post(`assets/add`, params)
 }

+ 5 - 0
src/api/department.js

@@ -3,4 +3,9 @@ import request from '@/utils/request'
 // 部门下拉列表
 export function simpleAll(params) {
     return request.get(`department/simpleAll`, { params: params })
+}
+
+ // 分单部门下拉列表
+export function allot(params) {
+    return request.get(`department/allot/${params}`)
 }

+ 9 - 0
src/router/index.js

@@ -14,6 +14,7 @@ import LoginView from '@/views/login/index.vue'
 // 资产业务
 import AssetsIndex from '@/views/assets/index.vue'
 import AssetsTodoDetailView from '@/views/assets/todoDetail.vue'
+import AssetsPlaceOrderView from '@/views/assets/placeOrder.vue'
 
 // 个贷业务
 import PersonalIndex from '@/views/personal/index.vue'
@@ -101,6 +102,14 @@ const routes = [
               title: '待办处理-资产'
             },
           },
+          {
+            path: 'placeOrder',
+            component: AssetsPlaceOrderView,
+            name: 'assetsPlaceOrder',
+            meta: {
+              title: '资产业务下单'
+            },
+          },
         ]
       },
       // 个贷业务

+ 19 - 0
src/stores/menuStore.js

@@ -0,0 +1,19 @@
+import { defineStore } from 'pinia'
+
+export const menuStore = defineStore('menu', {
+    state: () => ({
+        menuInfo: null //存储激活页面信息
+    }),
+    actions: {
+        setMenuInfo(data) {
+            this.menuInfo = data;
+        },
+        removeMenuInfo(){
+            this.menuInfo = null;
+        }
+    },
+    persist: {
+        enabled: true,   //开启持久化
+        key: 'menuInfo', //设置存储的key,详情见https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/config.html配置文档
+    },
+});

+ 369 - 0
src/views/assets/placeOrder.vue

@@ -0,0 +1,369 @@
+<template>
+  <div>
+    <van-nav-bar title="资产业务下单" left-text="返回" left-arrow @click-left="onClickLeft()" />
+    <div class="form-style">
+      <van-form @submit="addAssetsOrder()" label-width="8.7em">
+        <van-cell-group inset>
+          <van-field label="客户经理" v-model="assets.clientManager" name="clientManager" readonly />
+          <VanSinglePicker
+            label="分单类型"
+            v-model="assets.allotType"
+            v-bind:columns="allotTypeColumns"
+            name="allotType"
+            placeholder="请选择分单类型"
+            clearable
+            :rules="[{ required: true, message: '请选择分单类型' }]"
+            :required="true"
+          />
+          <VanSinglePicker
+            label="接单部门"
+            v-model="assets.departmentId"
+            v-bind:columns="allotDepartmentColumns"
+            name="departmentId"
+            placeholder="请选择接单部门"
+            clearable
+            :rules="[{ required: true, message: '请选择接单部门' }]"
+            :required="true"
+            v-if="assets.allotType === '指派'"
+          />
+          <van-field label="项目名称" v-model="assets.name" name="name" type="textarea" placeholder="请输入项目名称" :rules="[{ required: true, message: '请输入项目名称' }]" required />
+          <VanSinglePicker
+            label="业务类型"
+            v-model="assets.assetsBusinessGener"
+            v-bind:columns="businessGenerColumns"
+            name="assetsBusinessGener"
+            placeholder="请选择业务类型"
+            clearable
+            :rules="[{ required: true, message: '请选择业务类型' }]"
+            :required="true"
+            :search="true"
+          />
+          <van-field name="entrustAgain" label="客户再次委托" :rules="[{ required: true, message: '请选择是否客户再次委托' }]" required>
+            <template #input>
+              <van-radio-group v-model="assets.entrustAgain" direction="horizontal" icon-size="14px">
+                <van-radio name="false">否</van-radio>
+                <van-radio name="true">是</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <VanSinglePicker
+            label="客户类型"
+            v-model="assets.clienteleType"
+            v-bind:columns="clienteleTypeColumns"
+            name="clienteleType"
+            placeholder="请选择客户类型"
+            @change="changeCustomerType(0)"
+            clearable
+            :rules="[{ required: true, message: '请选择客户类型' }]"
+            :required="true"
+          />
+          <VanSinglePicker
+            label="客户名称"
+            v-model="assets.clienteleId"
+            v-bind:columns="customerCompanyColumns"
+            name="clienteleId"
+            placeholder="请选择客户名称"
+            @change="findSubCustomerCompany(0)"
+            clearable
+            :rules="[{ required: true, message: '请选择客户名称' }]"
+            :required="true"
+            :search="true"
+            v-if="assets.clienteleType === '企业'"
+          />
+          <VanSinglePicker
+            label="业务来源"
+            v-model="assets.clienteleSubId"
+            v-bind:columns="subCustomerCompanyColumns"
+            name="clienteleSubId"
+            placeholder="请选择业务来源"
+            @change="findCustomerContract()"
+            clearable
+            :rules="[{ required: true, message: '请选择业务来源' }]"
+            :required="true"
+            :search="true"
+            v-if="assets.clienteleType === '企业'"
+          />
+          <VanSinglePicker
+            label="客户联系人"
+            v-model="assets.clienteleContactId"
+            v-bind:columns="customerContractColumns"
+            name="clienteleContactId"
+            placeholder="请选择客户联系人"
+            clearable
+            :rules="[{ required: true, message: '请选择客户联系人' }]"
+            :required="true"
+            :search="true"
+          />
+          <van-field name="security" label="是否证券项目" :rules="[{ required: true, message: '请选择是否证券项目' }]" required>
+            <template #input>
+              <van-radio-group v-model="assets.security" direction="horizontal" icon-size="14px">
+                <van-radio name="false">否</van-radio>
+                <van-radio name="true">是</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <van-field name="significantAssetsReorganization" label="是否资产重组项目" :rules="[{ required: true, message: '请选择是否资产重组项目' }]" required>
+            <template #input>
+              <van-radio-group v-model="assets.significantAssetsReorganization" direction="horizontal" icon-size="14px">
+                <van-radio name="false">否</van-radio>
+                <van-radio name="true">是</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <van-field name="stateAssets" label="是否国资项目" :rules="[{ required: true, message: '请选择是否国资项目' }]" required>
+            <template #input>
+              <van-radio-group v-model="assets.stateAssets" direction="horizontal" icon-size="14px">
+                <van-radio name="false">否</van-radio>
+                <van-radio name="true">是</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <van-field name="foreignAssetsInvolved" label="是否涉及境外资产" :rules="[{ required: true, message: '请选择是否涉及境外资产' }]" required>
+            <template #input>
+              <van-radio-group v-model="assets.foreignAssetsInvolved" direction="horizontal" icon-size="14px">
+                <van-radio name="false">否</van-radio>
+                <van-radio name="true">是</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <van-field name="dispenseBenefit" label="是否分配产值" :rules="[{ required: true, message: '请选择是否分配产值' }]" required>
+            <template #input>
+              <van-radio-group v-model="assets.dispenseBenefit" direction="horizontal" icon-size="14px">
+                <van-radio name="false">否</van-radio>
+                <van-radio name="true">是</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <van-field label="委托人" v-model="assets.bailor" name="bailor" placeholder="请输入委托人" />
+          <van-field label="委托联系人" v-model="assets.bailorContactName" name="bailorContactName" placeholder="请输入委托联系人" />
+          <van-field label="委托电话" v-model="assets.bailorContactTel" name="bailorContactTel" placeholder="请输入委托电话" />
+          <van-field label="委托人地址" v-model="assets.bailorAddress" name="bailorAddress" placeholder="请输入委托人地址" />
+          <van-field label="订单备注" v-model="assets.remark" name="remark" type="textarea" />
+        </van-cell-group>
+        <div style="margin: 16px;">
+          <van-button round block type="primary" native-type="submit">提交</van-button>
+        </div>
+      </van-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapStores } from 'pinia';
+import { useUserStore } from '@/stores/useUserStore';
+import { showNotify } from 'vant';
+import VanSinglePicker from '@/components/VanSinglePicker/index.vue';
+import { customerLinkmanDrop } from '@/api/customerLinkman';
+import { customerCompanyDrop } from '@/api/customerCompany';
+import { allot } from '@/api/department';
+import { add } from '@/api/assets';
+import { commit } from '@/api/workflow';
+export default {
+  components: {
+    VanSinglePicker,
+  },
+  data() {
+    return {
+      // 分单类型
+      allotTypeColumns: [
+        { text: '指派', value: '指派' },
+        { text: '轮单', value: '轮单' },
+      ],
+      // 接单部门
+      allotDepartmentColumns: [],
+      // 业务类型
+      businessGenerColumns: [
+        {
+          text: '企业价值',
+          value: '企业价值',
+        },
+        {
+          text: '单项资产',
+          value: '单项资产',
+        },
+        {
+          text: '资产组合',
+          value: '资产组合',
+        },
+        {
+          text: '无形资产',
+          value: '无形资产',
+        },
+        {
+          text: '森林资源资产',
+          value: '森林资源资产',
+        },
+        {
+          text: '珠宝首饰艺术品',
+          value: '珠宝首饰艺术品',
+        },
+        {
+          text: '债权',
+          value: '债权',
+        },
+        {
+          text: '其他资产评估',
+          value: '其他资产评估',
+        },
+      ],
+      // 客户类型
+      clienteleTypeColumns: [
+        { text: '企业', value: '企业' },
+        { text: '个人', value: '个人' },
+      ],
+      // 客户名称
+      customerCompanyColumns: [],
+      // 业务来源
+      subCustomerCompanyColumns: [],
+      // 客户联系人
+      customerContractColumns: [],
+      assets: {
+        clientManagerId: null,
+        clientManager: null,
+        allotType: '指派',
+        departmentId: null,
+        name: null,
+        entrustAgain: 'false',
+        clienteleType: '企业',
+        clienteleId: null,
+        clienteleSubId: null,
+        clienteleContactId: null,
+        security: 'false',
+        significantAssetsReorganization: 'false',
+        stateAssets: 'false',
+        foreignAssetsInvolved: 'false',
+        dispenseBenefit: 'false',
+        bailor: null,
+        bailorContactName: null,
+        bailorContactTel: null,
+        bailorAddress: null,
+        remark: null,
+      },
+    };
+  },
+  computed: {
+    ...mapStores(useUserStore),
+  },
+  created() {
+    this.assets.clientManagerId = this.userStore.userInfo.id;
+    this.assets.clientManager = this.userStore.userInfo.name;
+    this.getAllotDepartment();
+    this.changeCustomerType();
+  },
+  methods: {
+    onClickLeft() {
+      history.back();
+    },
+    // 获取部门下拉列表
+    getAllotDepartment() {
+      allot('ASSET_BUSINESS').then((res) => {
+        if (res.code === 200) {
+          // 使用 map 方法提取 id 和 name 属性
+          this.allotDepartmentColumns = res.data.map((item) => ({
+            value: String(item.id),
+            text: String(item.name),
+          }));
+        }
+      });
+    },
+    // 客户类型改变的触发
+    changeCustomerType(val) {
+      // 清空客户信息
+      this.customerCompanyColumns = [];
+      this.subCustomerCompanyColumns = [];
+      this.customerContractColumns = [];
+      this.assets.clienteleId = null;
+      this.assets.clienteleSubId = null;
+      this.assets.clienteleContactId = null;
+
+      // 判断客户类型
+      if (this.assets.clienteleType === '个人') {
+        // 个人类型直接获取客户联系人
+        let simpleAll = new Object();
+        simpleAll.ccId = 1;
+        simpleAll.terminal = 0;
+        customerLinkmanDrop(simpleAll).then((res) => {
+          if (res.code === 200) {
+            // 使用 map 方法提取 id 和 name 属性
+            this.customerContractColumns = res.data.map((item) => ({
+              value: String(item.id),
+              text: String(item.name),
+            }));
+          }
+        });
+      } else {
+        let simpleAll = new Object();
+        simpleAll.terminal = 0;
+        customerCompanyDrop(simpleAll).then((res) => {
+          if (res.code === 200) {
+            // 使用 map 方法提取 id 和 name 属性
+            this.customerCompanyColumns = res.data.map((item) => ({
+              value: String(item.id),
+              text: String(item.name),
+            }));
+          }
+        });
+      }
+    },
+    // 获取业务来源
+    findSubCustomerCompany(val) {
+      // 清空业务来源和客户联系人信息
+      this.subCustomerCompanyColumns = [];
+      this.customerContractColumns = [];
+      this.assets.clienteleSubId = null;
+      this.assets.clienteleContactId = null;
+      // 判断客户名称id不为空
+      if (this.assets.clienteleId) {
+        let simpleAll = new Object();
+        simpleAll.terminal = val;
+        simpleAll.parentId = this.assets.clienteleId;
+        customerCompanyDrop(simpleAll).then((res) => {
+          if (res.code === 200) {
+            // 使用 map 方法提取 id 和 name 属性
+            this.subCustomerCompanyColumns = res.data.map((item) => ({
+              value: String(item.id),
+              text: String(item.name),
+            }));
+          }
+        });
+      }
+    },
+    // 获取企业的客户联系人信息
+    findCustomerContract() {
+      // 清空客户联系人信息
+      this.customerContractColumns = [];
+      this.assets.clienteleContactId = null;
+      let simpleAll = new Object();
+      simpleAll.ccId = this.assets.clienteleSubId;
+      customerLinkmanDrop(simpleAll).then((res) => {
+        if (res.code === 200) {
+          // 使用 map 方法提取 id 和 name 属性
+          this.customerContractColumns = res.data.map((item) => ({
+            value: String(item.id),
+            text: String(item.name),
+          }));
+        }
+      });
+    },
+    // 资产下单
+    addAssetsOrder() {
+      add(this.assets).then((res) => {
+        if (res.code === 200) {
+          if (res.data && res.data.instanceNodeId && res.data.state) {
+            commit(res.data).then((result) => {
+              if (result.code === 200 && result.data) {
+                showNotify({ type: 'success', message: '下单并提交流程成功' });
+              }
+            });
+          } else {
+            showNotify({ type: 'success', message: '下单成功, 需要手动提交流程' });
+          }
+          history.back();
+        } else {
+          showNotify({ type: 'danger', message: '下单失败, 请稍后再试' });
+        }
+      });
+    },
+  },
+};
+</script>

+ 7 - 2
src/views/home/index.vue

@@ -18,9 +18,10 @@
 </template>
 
 <script>
-import { userInfo } from '@/api/user';
+import { userInfo, userMenus } from '@/api/user';
 import { mapStores } from 'pinia';
 import { useUserStore } from '@/stores/useUserStore';
+import { menuStore } from '@/stores/menuStore';
 import { removeToken } from '@/utils/auth';
 
 import { Tabbar, NavBar } from './components';
@@ -38,14 +39,18 @@ export default {
     // 直接放在生命周期函数也可以访问,但是似乎会导致持久化失效,没找到解决办法,建议还是用mapStores
     // 名字会变成id + 'Store' 的形式,比如id本来是user,那么这种方式使用就需要变成this.userStore.xxx
     ...mapStores(useUserStore),
+    ...mapStores(menuStore),
   },
   created() {
     this.getUserInfo();
   },
   methods: {
     getUserInfo() {
-      userInfo().then((res) => {
+      userInfo().then((res) => { // 获取用户信息
         this.userStore.setUserInfo(res.data);
+        userMenus().then((res) => { // 获取菜单权限
+          this.menuStore.setMenuInfo(res.data);
+        });
       });
     },
     goBench(route) {

+ 32 - 6
src/views/home/start.vue

@@ -2,7 +2,7 @@
   <div>
     <div class="card">
       <h3 class="businessTitle">快速发起</h3>
-      <div class="icon-area" @click="goBench('/index/major/placeOrder')">
+      <div class="icon-area" v-if="meunNames.includes('大中型业务')" @click="goBench('/index/major/placeOrder')">
         <svg t="1716189375497" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2709" width="48" height="48">
           <path
             d="M810.666667 1024H213.333333c-117.333333 0-213.333333-96-213.333333-213.333333V213.333333C0 96 96 0 213.333333 0h597.333334c117.333333 0 213.333333 96 213.333333 213.333333v597.333334c0 117.333333-96 213.333333-213.333333 213.333333z"
@@ -19,7 +19,7 @@
         </svg>
         <div class="icon-word">大中型下单</div>
       </div>
-      <div class="icon-area" @click="goBench('/index/personal/placeOrder')">
+      <div class="icon-area" v-if="meunNames.includes('个贷业务')" @click="goBench('/index/personal/placeOrder')">
         <svg t="1716189375497" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2709" width="48" height="48">
           <path
             d="M810.666667 1024H213.333333c-117.333333 0-213.333333-96-213.333333-213.333333V213.333333C0 96 96 0 213.333333 0h597.333334c117.333333 0 213.333333 96 213.333333 213.333333v597.333334c0 117.333333-96 213.333333-213.333333 213.333333z"
@@ -36,7 +36,7 @@
         </svg>
         <div class="icon-word">个贷下单</div>
       </div>
-      <div class="icon-area" @click="goBench('/index/land/placeOrder')">
+      <div class="icon-area" v-if="meunNames.includes('土地规划项目')" @click="goBench('/index/land/placeOrder')">
         <svg t="1716189375497" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2709" width="48" height="48">
           <path
             d="M810.666667 1024H213.333333c-117.333333 0-213.333333-96-213.333333-213.333333V213.333333C0 96 96 0 213.333333 0h597.333334c117.333333 0 213.333333 96 213.333333 213.333333v597.333334c0 117.333333-96 213.333333-213.333333 213.333333z"
@@ -53,7 +53,7 @@
         </svg>
         <div class="icon-word">土规下单</div>
       </div>
-      <div class="icon-area" @click="goBench('/index/assets')">
+      <div class="icon-area" v-if="meunNames.includes('资产业务')" @click="goBench('/index/assets/placeOrder')">
         <svg t="1716189375497" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2709" width="48" height="48">
           <path
             d="M810.666667 1024H213.333333c-117.333333 0-213.333333-96-213.333333-213.333333V213.333333C0 96 96 0 213.333333 0h597.333334c117.333333 0 213.333333 96 213.333333 213.333333v597.333334c0 117.333333-96 213.333333-213.333333 213.333333z"
@@ -75,13 +75,39 @@
 </template>
 
 <script>
+import { mapStores } from 'pinia';
+import { useUserStore } from '@/stores/useUserStore';
+import { menuStore } from '@/stores/menuStore';
+import { showNotify } from 'vant';
+
 export default {
   data() {
-    return {};
+    return {
+      meunNames: []
+    };
+  },
+  computed: {
+    ...mapStores(useUserStore),
+    ...mapStores(menuStore),
+  },
+  created() {
+    this.meunNames = this.menuStore.menuInfo.map(item => item.name);
   },
   methods: {
     goBench(route) {
-      this.$router.push(route);
+      let hasOpenBar = false;
+      const postList = this.userStore.userInfo.postList.map((item) => item.name);
+      const marketPosts = ['销售代表', '客户经理', '客户经理-业务员', '市场一部经理', '市场二部经理', '销售主管', '市场部经理', '营销主管'];
+      postList.forEach((element) => {
+        if (marketPosts.includes(element)) {
+          hasOpenBar = true;
+        }
+      });
+      if (hasOpenBar) {
+        this.$router.push(route);
+      } else {
+        showNotify({ type: 'danger', message: '只有市场部人员才能下单' });
+      }
     },
   },
 };

+ 6 - 5
src/views/major/placeOrder.vue

@@ -109,7 +109,7 @@
             :rules="[{ required: true, message: '请选择客户联系人' }]"
             :required="true"
           />
-          <van-field name="dispenseBenefitRadio" label="分配产值" :rules="[{ required: true, message: '请选择客户联系人' }]" required>
+          <van-field name="dispenseBenefitRadio" label="分配产值" :rules="[{ required: true, message: '请选择是否分配产值' }]" required>
             <template #input>
               <van-radio-group v-model="major.dispenseBenefit" direction="horizontal" icon-size="14px">
                 <van-radio name="false">否</van-radio>
@@ -117,7 +117,7 @@
               </van-radio-group>
             </template>
           </van-field>
-          <van-field name="nonnativeRadio" label="是否异地" :rules="[{ required: true, message: '请选择客户联系人' }]" required>
+          <van-field name="nonnativeRadio" label="是否异地" :rules="[{ required: true, message: '请选择是否异地' }]" required>
             <template #input>
               <van-radio-group v-model="major.nonnative" direction="horizontal" icon-size="14px">
                 <van-radio name="false">否</van-radio>
@@ -125,7 +125,7 @@
               </van-radio-group>
             </template>
           </van-field>
-          <van-field name="refinanceRadio" label="是否续贷" :rules="[{ required: true, message: '请选择客户联系人' }]" required>
+          <van-field name="refinanceRadio" label="是否续贷" :rules="[{ required: true, message: '请选择是否续贷' }]" required>
             <template #input>
               <van-radio-group v-model="major.refinance" direction="horizontal" icon-size="14px">
                 <van-radio name="false">否</van-radio>
@@ -133,7 +133,7 @@
               </van-radio-group>
             </template>
           </van-field>
-          <van-field name="loanExpireRadio" label="贷款到期" :rules="[{ required: true, message: '请选择客户联系人' }]">
+          <van-field name="loanExpireRadio" label="贷款到期" :rules="[{ required: true, message: '请选择是否贷款到期' }]">
             <template #input>
               <van-radio-group v-model="major.loanExpire" direction="horizontal" icon-size="14px">
                 <van-radio name="false">否</van-radio>
@@ -300,6 +300,7 @@ export default {
     onClickLeft() {
       history.back();
     },
+    // 清空项目类型
     clearType() {
       this.major.specialType = null;
       this.major.businessGener = null;
@@ -400,7 +401,7 @@ export default {
           }
           history.back();
         } else {
-          showNotify({ type: 'success', message: '下单失败, 请稍后再试' });
+          showNotify({ type: 'danger', message: '下单失败, 请稍后再试' });
         }
       });
     },

+ 1 - 1
src/views/personal/placeOrder.vue

@@ -284,7 +284,7 @@ export default {
           }
           history.back();
         } else {
-          showNotify({ type: 'success', message: '下单失败, 请稍后再试' });
+          showNotify({ type: 'danger', message: '下单失败, 请稍后再试' });
         }
       });
     },