Kaynağa Gözat

feat: 中标管理、合同管理、履约管理页面新增,线索列表完善

liyang 4 ay önce
ebeveyn
işleme
cfd6a35ac5

+ 1 - 1
src/views/market-manage/external-manage/clue-management/view-details/components/SectionManagement.vue

@@ -29,7 +29,7 @@ import {useRouter} from "vue-router";
 import sectionSreation from "./sectionSreation.vue";
 
 const {id} = defineProps(['id'])
-const router = useRouter()
+
 const memberModalRef = ref(null)
 function openModal(title, data) {
   memberModalRef.value.showModal(title, data)

+ 3 - 3
src/views/market-manage/external-manage/clue-management/view-details/components/sectionSreation.vue

@@ -89,14 +89,14 @@ import {addMember, addSectionSreation, getPersonalOriganization} from "/@/api/ma
 import {isEmpty} from 'lodash';
 
 const emit = defineEmits(['fetchTableData'])
-const props = defineProps(['title'])
+const props = defineProps(['title','id'])
 const formData = ref({
-  id: "",
+  id: props.id,
   sectionName: "",
   budgetAmount: 0,
   tenderDate: "",
   competitor: "",
-  note: ""
+  notes: ""
 })
 const rules = {
   sectionName: [{required: true, message: '请选择标段名称'}],

+ 186 - 0
src/views/project-manage/bid-management/index.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="table-demo">
+    <bs-table v-bind="tableOptions">
+    </bs-table>
+    <add-or-edit-drawer ref="addOrEditDrawerRef"/>
+  </div>
+</template>
+
+<script setup lang="jsx">
+import BsTable, {useBsTable} from '/@/components/BsUi/Table/index.js';
+import {onMounted, ref} from 'vue';
+import AddOrEditDrawer from '/@/views/table-demo/components/AddOrEditDrawer.vue';
+import {useRouter} from 'vue-router';
+import {DISPLAY_STATE} from "/@/components/BsUi/constant.js";
+
+const addOrEditDrawerRef = ref(null);
+const router = useRouter();
+onMounted(() => {
+  refreshTable();
+});
+const {
+      tableOptions,
+      setTablePropsValue: setValue,
+      getTablePropsValue: getValue,
+      refreshTable
+    } = useBsTable({
+      tableOptions: {
+        url: '/supports/project/queryPage',
+        gridOptions: {
+          loading: false,
+          columns: [
+            {
+              field: 'projectName',
+              title: '项目名称',
+              width: 150
+            },
+            {
+              field: 'projectId',
+              title: '项目ID',
+              width: 150
+            },
+            {
+              field: 'projectAddress',
+              title: '项目地址',
+              width: 150
+            },
+            {
+              field: 'projectBudgets',
+              title: '预计合同金额(元)',
+              width: 150
+            },
+            {
+              field: 'projectSource',
+              title: '项目来源',
+              width: 150
+            },
+            {
+              field: 'projectType',
+              title: '项目类型',
+              width: 150,
+              slots: {
+                default({row, column}) {
+                  return <span>{row?.projectType?.[0].valueName}</span>;
+                },
+              },
+            },
+            {
+              field: 'businessType',
+              title: '产品类型',
+              width: 150
+            },
+            {
+              field: 'tenderDate',
+              title: '预计开标日期',
+              width: 150
+            },
+            {
+              field: 'belongMarketer',
+              title: '预计投标',
+              width: 150
+            },
+            {
+              field: 'belongMarketingDepartment',
+              title: '归属营销',
+              width: 150
+            },
+            {
+              field: 'name',
+              title: '操作人',
+              width: 150
+            },
+            {
+              field: 'name',
+              title: '操作时间',
+              width: 150
+            },
+            {
+              cellRender: {
+                name: 'CellOption',
+                extraProps: {
+                  buttons: [
+                    {
+                      title: '查看详情',
+                      code: 'view',
+                      display: ({row}) => {
+                        return DISPLAY_STATE.VISIBLE;
+                      },
+                      disabled({row}) {
+                        return false;
+                      },
+                      onClick({row}) {
+                        goDetailPage(row)
+                      },
+                      extraProps: {},
+                    },
+                  ],
+                },
+              },
+            }
+          ],
+        },
+        searchConfig: {
+          enabled: true,
+          fieldSpan:
+              4,
+          fields:
+              [
+                {
+                  field: 'projectName',
+                  component: 'a-input',
+                  componentProps: {
+                    placeholder: '请输入项目名称',
+                  },
+                },
+                {
+                  field: 'projectId',
+                  component: 'a-input',
+                  componentProps: {
+                    placeholder: '请输入项目ID',
+                  },
+                },
+                {
+                  field: 'projectAddress',
+                  component: 'a-select',
+                  componentProps: {
+                    placeholder: '请选择地址',
+                  },
+                },
+                {
+                  field: 'status',
+                  component: 'a-select',
+                  componentProps: {
+                    placeholder: '请选择项目状态',
+                  },
+                },
+              ],
+        }
+        ,
+        pagerConfig: {
+          enabled: true,
+          pageSize:
+              10,
+          pageNum:
+              1,
+          total:
+              0,
+        }
+        ,
+      },
+    })
+;
+const goDetailPage = (record) => {
+  console.log(record.id)
+  router.push({
+    path: "/market-manage/external-manage/clue-management/view-details",
+    query: {
+      id: record.id
+    }
+  });
+}
+</script>
+
+<style scoped lang="scss">
+.table-demo {
+}
+</style>

+ 186 - 0
src/views/project-manage/contract-management/index.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="table-demo">
+    <bs-table v-bind="tableOptions">
+    </bs-table>
+    <add-or-edit-drawer ref="addOrEditDrawerRef"/>
+  </div>
+</template>
+
+<script setup lang="jsx">
+import BsTable, {useBsTable} from '/@/components/BsUi/Table/index.js';
+import {onMounted, ref} from 'vue';
+import AddOrEditDrawer from '/@/views/table-demo/components/AddOrEditDrawer.vue';
+import {useRouter} from 'vue-router';
+import {DISPLAY_STATE} from "/@/components/BsUi/constant.js";
+
+const addOrEditDrawerRef = ref(null);
+const router = useRouter();
+onMounted(() => {
+  refreshTable();
+});
+const {
+      tableOptions,
+      setTablePropsValue: setValue,
+      getTablePropsValue: getValue,
+      refreshTable
+    } = useBsTable({
+      tableOptions: {
+        url: '/supports/project/queryPage',
+        gridOptions: {
+          loading: false,
+          columns: [
+            {
+              field: 'projectName',
+              title: '项目名称',
+              width: 150
+            },
+            {
+              field: 'projectId',
+              title: '项目ID',
+              width: 150
+            },
+            {
+              field: 'projectAddress',
+              title: '项目地址',
+              width: 150
+            },
+            {
+              field: 'projectBudgets',
+              title: '预计合同金额(元)',
+              width: 150
+            },
+            {
+              field: 'projectSource',
+              title: '项目来源',
+              width: 150
+            },
+            {
+              field: 'projectType',
+              title: '项目类型',
+              width: 150,
+              slots: {
+                default({row, column}) {
+                  return <span>{row?.projectType?.[0].valueName}</span>;
+                },
+              },
+            },
+            {
+              field: 'businessType',
+              title: '产品类型',
+              width: 150
+            },
+            {
+              field: 'tenderDate',
+              title: '预计开标日期',
+              width: 150
+            },
+            {
+              field: 'belongMarketer',
+              title: '预计投标',
+              width: 150
+            },
+            {
+              field: 'belongMarketingDepartment',
+              title: '归属营销',
+              width: 150
+            },
+            {
+              field: 'name',
+              title: '操作人',
+              width: 150
+            },
+            {
+              field: 'name',
+              title: '操作时间',
+              width: 150
+            },
+            {
+              cellRender: {
+                name: 'CellOption',
+                extraProps: {
+                  buttons: [
+                    {
+                      title: '查看详情',
+                      code: 'view',
+                      display: ({row}) => {
+                        return DISPLAY_STATE.VISIBLE;
+                      },
+                      disabled({row}) {
+                        return false;
+                      },
+                      onClick({row}) {
+                        goDetailPage(row)
+                      },
+                      extraProps: {},
+                    },
+                  ],
+                },
+              },
+            }
+          ],
+        },
+        searchConfig: {
+          enabled: true,
+          fieldSpan:
+              4,
+          fields:
+              [
+                {
+                  field: 'projectName',
+                  component: 'a-input',
+                  componentProps: {
+                    placeholder: '请输入项目名称',
+                  },
+                },
+                {
+                  field: 'projectId',
+                  component: 'a-input',
+                  componentProps: {
+                    placeholder: '请输入项目ID',
+                  },
+                },
+                {
+                  field: 'projectAddress',
+                  component: 'a-select',
+                  componentProps: {
+                    placeholder: '请选择地址',
+                  },
+                },
+                {
+                  field: 'status',
+                  component: 'a-select',
+                  componentProps: {
+                    placeholder: '请选择项目状态',
+                  },
+                },
+              ],
+        }
+        ,
+        pagerConfig: {
+          enabled: true,
+          pageSize:
+              10,
+          pageNum:
+              1,
+          total:
+              0,
+        }
+        ,
+      },
+    })
+;
+const goDetailPage = (record) => {
+  console.log(record.id)
+  router.push({
+    path: "/market-manage/external-manage/clue-management/view-details",
+    query: {
+      id: record.id
+    }
+  });
+}
+</script>
+
+<style scoped lang="scss">
+.table-demo {
+}
+</style>

+ 233 - 0
src/views/project-manage/performance-management/index.vue

@@ -0,0 +1,233 @@
+<template>
+  <div class="customer-management">
+    <a-tabs v-model:activeKey="activeKey" class="tabs">
+      <a-tab-pane v-for="(item, index) in tabsOptions" :key="index">
+        <template #tab>
+          <span @click="item.onClick(item.params)">
+            <component :is="item.icon"></component>
+            {{ item.title }}({{ item.count }})
+          </span>
+        </template>
+      </a-tab-pane>
+    </a-tabs>
+    <bs-table v-bind="tableOptions"></bs-table>
+  </div>
+</template>
+<script setup lang="jsx">
+import { ref, reactive, h, onMounted, watch } from 'vue';
+import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
+
+import { useRouter } from 'vue-router';
+import { fetchTotalHeader } from '/@/api/customer-manage/index.js';
+
+
+const activeKey = ref(0);
+
+const tabsOptions = [
+  {
+    title: '交付中',
+    icon: 'AppstoreOutlined',
+    count: 0,
+    params: {
+      a: 1,
+    },
+    onClick: (value) => {
+      console.log(value);
+    },
+  },
+  {
+    title: '质保中',
+    icon: 'TeamOutlined',
+    count: 0,
+    params: {},
+    onClick: (value) => {},
+  },
+  {
+    title: '已关闭',
+    count: 0,
+    icon: 'FileSyncOutlined',
+    params: {},
+    onClick: (value) => {},
+  },
+];
+const {
+  tableOptions,
+  setTablePropsValue: setValue,
+  getTablePropsValue: getValue,
+  fetchTableData,
+} = useBsTable({
+  tableOptions: {
+    url: '/supports/customer/queryPage',
+    gridOptions: {
+      height: 600,
+      loading: false,
+      data: [],
+      columns: [
+        // {
+        //   type: 'seq',
+        //   width: 80,
+        // },
+
+        {
+          field: 'customerName',
+          title: '项目名称',
+          width: 200,
+        },
+        {
+          field: 'customerId',
+          title: '项目ID',
+          width: 100,
+        },
+        {
+          field: '',
+          title: '项目状态',
+          width: 100,
+        },
+        {
+          field: '',
+          title: '合同总金额(元)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '已回款总金额(元)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '已回款比例(%)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '未回款总金额(元)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '已开票总金额(元)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '未开票总金额(元)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '罚款总金额(元)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '形象进度(%)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '合同进度(%)',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '产值进度(%)',
+          width: 150,
+        },
+        {
+          field: 'id',
+          title: '项目类型',
+          width: 150,
+        },
+        {
+          field: '',
+          title: '项目来源',
+          width: 150,
+        },
+        {
+          field: 'customerType',
+          title: '参与服务商',
+          width: 150,
+          cellRender: {
+            name: 'CellDict',
+          },
+        },
+        {
+          field: 'customerSource',
+          title: '参与服务商电话',
+          width: 150,
+          cellRender: {
+            name: 'CellDict',
+          },
+        },
+        {
+          field: 'belongRegion',
+          title: '归属营销人员',
+          width: 150,
+        },
+        {
+          field: 'customerGrade',
+          title: '归属营销部门',
+          width: 150,
+          cellRender: {
+            name: 'CellDict',
+          },
+        },
+      ],
+    },
+    searchConfig: {
+      enabled: true,
+      fieldSpan: 4,
+      fields: [
+        {
+          field: 'name',
+          label: '项目名称',
+          component: 'a-input',
+          componentProps: {
+            placeholder: '请输入项目名称',
+          },
+        }
+      ],
+    },
+    pagerConfig: {
+      enabled: true,
+      pageSize: 10,
+      pageNum: 1,
+      total: 0,
+      isFixed: false,
+    },
+    mounted() {
+      updateHeaderInfo();
+    },
+  },
+});
+
+const updateTabsCount = (counts) => {
+  counts.forEach((val, idx) => {
+    tabsOptions.value[idx].count = val || 0;
+  });
+};
+
+const updateHeaderInfo = async () => {
+  const headerInfo = await fetchTotalHeader();
+  const { customerQuantity, customerAuditQuantity, customerInvalidQuantity, customerValidQuantity } = headerInfo.data;
+  updateTabsCount([customerQuantity, customerAuditQuantity, customerInvalidQuantity, customerValidQuantity]);
+};
+
+watch(activeKey, () => {
+  fetchTableData();
+});
+</script>
+<style lang="scss" scoped>
+.customer-management {
+  background-color: #fff;
+  height: 100%;
+
+  .tabs {
+    padding: 0 24px;
+
+    :deep(.anticon) {
+      margin: 0;
+    }
+  }
+}
+</style>