Browse Source

账单管理,收款记录管理,售后管理,客户管理,签约管理(上半部)

GXL 1 năm trước cách đây
mục cha
commit
4dd118bb63

+ 2 - 2
.env.dev

@@ -6,9 +6,9 @@ VUE_APP_TITLE = 会助理管理平台
 
 # 会助理管理平台
 # 本地环境
-# VUE_APP_BASE_API = 'http://localhost:48080'
+VUE_APP_BASE_API = 'http://localhost:48080'
 # 测试环境
-VUE_APP_BASE_API = 'https://ts.willalp.com:48080'
+# VUE_APP_BASE_API = 'https://ts.willalp.com:48080'
 # 线上环境
 # VUE_APP_BASE_API = 'https://hzl.willalp.com:48080'
 

+ 54 - 0
src/api/supplier/afterSale.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建售后列
+export function createAfterSale(data) {
+  return request({
+    url: '/supplier/after-sale/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新售后列
+export function updateAfterSale(data) {
+  return request({
+    url: '/supplier/after-sale/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除售后列
+export function deleteAfterSale(id) {
+  return request({
+    url: '/supplier/after-sale/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得售后列
+export function getAfterSale(id) {
+  return request({
+    url: '/supplier/after-sale/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得售后列分页
+export function getAfterSalePage(query) {
+  return request({
+    url: '/supplier/after-sale/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出售后列 Excel
+export function exportAfterSaleExcel(query) {
+  return request({
+    url: '/supplier/after-sale/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 62 - 0
src/api/supplier/billInfo.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 创建账单
+export function createBillInfo(data) {
+  return request({
+    url: '/supplier/bill-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新账单
+export function updateBillInfo(data) {
+  return request({
+    url: '/supplier/bill-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除账单
+export function deleteBillInfo(id) {
+  return request({
+    url: '/supplier/bill-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得账单
+export function getBillInfo(id) {
+  return request({
+    url: '/supplier/bill-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得账单分页
+export function getBillInfoPage(query) {
+  return request({
+    url: '/supplier/bill-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出账单 Excel
+export function exportBillInfoExcel(query) {
+  return request({
+    url: '/supplier/bill-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 获得付款详情记录
+export function getPayDetailList(id) {
+  return request({
+    url: '/supplier/bill-info/getPayDetailList?id=' + id,
+    method: 'get'
+  })
+}

+ 54 - 0
src/api/supplier/clientInfo.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建客户管理
+export function createClientInfo(data) {
+  return request({
+    url: '/supplier/client-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新客户管理
+export function updateClientInfo(data) {
+  return request({
+    url: '/supplier/client-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除客户管理
+export function deleteClientInfo(id) {
+  return request({
+    url: '/supplier/client-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得客户管理
+export function getClientInfo(id) {
+  return request({
+    url: '/supplier/client-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得客户管理分页
+export function getClientInfoPage(query) {
+  return request({
+    url: '/supplier/client-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出客户管理 Excel
+export function exportClientInfoExcel(query) {
+  return request({
+    url: '/supplier/client-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 67 - 0
src/api/supplier/goods.js

@@ -0,0 +1,67 @@
+import request from '@/utils/request'
+
+// 创建商品列表
+export function createGoods(data) {
+  return request({
+    url: '/supplier/goods/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新商品列表
+export function updateGoods(data) {
+  return request({
+    url: '/supplier/goods/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品列表
+export function deleteGoods(id) {
+  return request({
+    url: '/supplier/goods/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得商品列表
+export function getGoods(id) {
+  return request({
+    url: '/supplier/goods/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得商品列表分页
+export function getGoodsPage(query) {
+  return request({
+    url: '/supplier/goods/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出商品列表 Excel
+export function exportGoodsExcel(query) {
+  return request({
+    url: '/supplier/goods/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 商品状态修改
+export function changeGoodsStatus(id, state) {
+  const data = {
+    id,
+    state
+  }
+  return request({
+    url: '/supplier/goods/update-status',
+    method: 'put',
+    data: data
+  })
+}

+ 54 - 0
src/api/supplier/goodsDetail.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建商品详情
+export function createGoodsDetail(data) {
+  return request({
+    url: '/supplier/goods-detail/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新商品详情
+export function updateGoodsDetail(data) {
+  return request({
+    url: '/supplier/goods-detail/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品详情
+export function deleteGoodsDetail(id) {
+  return request({
+    url: '/supplier/goods-detail/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得商品详情
+export function getGoodsDetail(id) {
+  return request({
+    url: '/supplier/goods-detail/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得商品详情分页
+export function getGoodsDetailPage(query) {
+  return request({
+    url: '/supplier/goods-detail/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出商品详情 Excel
+export function exportGoodsDetailExcel(query) {
+  return request({
+    url: '/supplier/goods-detail/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/payLogDetail.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建付款详情
+export function createPayLogDetail(data) {
+  return request({
+    url: '/supplier/pay-log-detail/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新付款详情
+export function updatePayLogDetail(data) {
+  return request({
+    url: '/supplier/pay-log-detail/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除付款详情
+export function deletePayLogDetail(id) {
+  return request({
+    url: '/supplier/pay-log-detail/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得付款详情
+export function getPayLogDetail(id) {
+  return request({
+    url: '/supplier/pay-log-detail/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得付款详情分页
+export function getPayLogDetailPage(query) {
+  return request({
+    url: '/supplier/pay-log-detail/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出付款详情 Excel
+export function exportPayLogDetailExcel(query) {
+  return request({
+    url: '/supplier/pay-log-detail/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 62 - 0
src/api/supplier/receiveLog.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 创建交易记录
+export function createReceiveLog(data) {
+  return request({
+    url: '/supplier/receive-log/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新交易记录
+export function updateReceiveLog(data) {
+  return request({
+    url: '/supplier/receive-log/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除交易记录
+export function deleteReceiveLog(id) {
+  return request({
+    url: '/supplier/receive-log/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得交易记录
+export function getReceiveLog(id) {
+  return request({
+    url: '/supplier/receive-log/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得交易记录分页
+export function getReceiveLogPage(query) {
+  return request({
+    url: '/supplier/receive-log/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出交易记录 Excel
+export function exportReceiveLogExcel(query) {
+  return request({
+    url: '/supplier/receive-log/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 获得收款详情记录
+export function getReceiveDetailList(id) {
+  return request({
+    url: '/supplier/receive-log/getReceiveDetailList?id=' + id,
+    method: 'get'
+  })
+}

+ 54 - 0
src/api/supplier/receiveLogDetail.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建收款详情
+export function createReceiveLogDetail(data) {
+  return request({
+    url: '/supplier/receive-log-detail/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新收款详情
+export function updateReceiveLogDetail(data) {
+  return request({
+    url: '/supplier/receive-log-detail/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除收款详情
+export function deleteReceiveLogDetail(id) {
+  return request({
+    url: '/supplier/receive-log-detail/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得收款详情
+export function getReceiveLogDetail(id) {
+  return request({
+    url: '/supplier/receive-log-detail/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得收款详情分页
+export function getReceiveLogDetailPage(query) {
+  return request({
+    url: '/supplier/receive-log-detail/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出收款详情 Excel
+export function exportReceiveLogDetailExcel(query) {
+  return request({
+    url: '/supplier/receive-log-detail/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/signingInfo.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建签约管理
+export function createSigningInfo(data) {
+  return request({
+    url: '/supplier/signing-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新签约管理
+export function updateSigningInfo(data) {
+  return request({
+    url: '/supplier/signing-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除签约管理
+export function deleteSigningInfo(id) {
+  return request({
+    url: '/supplier/signing-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得签约管理
+export function getSigningInfo(id) {
+  return request({
+    url: '/supplier/signing-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得签约管理分页
+export function getSigningInfoPage(query) {
+  return request({
+    url: '/supplier/signing-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出签约管理 Excel
+export function exportSigningInfoExcel(query) {
+  return request({
+    url: '/supplier/signing-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 23 - 0
src/utils/dict.js

@@ -280,6 +280,29 @@ export const DICT_TYPE = {
 
   PLATFORM_MESSAGE_TYPE: 'platform_message_type',//平台消息类型
 
+  // ========== supplier 供应商模块 ==========
+  GOODS_PACK: "goods_pack",//商品包装方式
+
+  PRICE_STRATEGY: "price_strategy",//价格策略
+
+  AFTERSALE_STRATEGY: "aftersale_strategy",//售后策略
+
+  BILL_STATE: "bill_state",//账单状态
+
+  BILL_CATEGORY: "bill_category",//账单类型
+
+  AFTERSALE_CATEGORY: "aftersale_category",//售后类型
+
+  AFTERSALE_STATE: "aftersale_state",//售后处理状态
+
+  AFTERSALE_RESULT: "aftersale_result",//售后处理结果
+
+  AFTERSALE_METHOD: "aftersale_method",//售后处理方式
+
+  CLIENT_CATEGORY: "client_category",//客户类型
+
+  SIGNING_STATE: "signing_state",//签约状态
+
   SALE_ORDER_TYPE: 'sale_order_type',
 
   PROVISION_PERIOD: 'provision_period',

+ 428 - 0
src/views/supplier/afterSale/index.vue

@@ -0,0 +1,428 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="售后工单号" prop="ticketNum">
+        <el-input v-model="queryParams.ticketNum" placeholder="请输入售后工单号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="订单编号" prop="orderCode">
+        <el-input v-model="queryParams.orderCode" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="售后类型" prop="category">
+        <el-select v-model="queryParams.category" placeholder="请选择售后类型" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_CATEGORY)" :key="dict.value"
+            :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="处理状态" prop="state">
+        <el-select v-model="queryParams.state" placeholder="请选择处理状态" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STATE)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="处理人" prop="processor">
+        <el-input v-model="queryParams.processor" placeholder="请输入处理人" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="工单接受人" prop="receivePerson">
+        <el-input v-model="queryParams.receivePerson" placeholder="请输入工单接受人" clearable
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @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="['supplier:after-sale:create']">新增</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:after-sale:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="售后工单号" align="center" prop="ticketNum" />
+      <el-table-column label="订单编号" align="center" prop="orderCode" />
+      <el-table-column label="售后类型" align="center" prop="category">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_CATEGORY" :value="scope.row.category" />
+        </template>
+      </el-table-column>
+      <el-table-column label="处理状态" align="center" prop="state">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_STATE" :value="scope.row.state" />
+        </template>
+      </el-table-column>
+      <el-table-column label="处理开始时间" align="center" prop="startTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.startTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="处理结束时间" align="center" prop="endTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.endTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="处理结果" align="center" prop="result">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_RESULT" :value="scope.row.result" />
+        </template>
+      </el-table-column>
+      <el-table-column label="客户评价" align="center" prop="evaluation" />
+      <el-table-column label="处理人" align="center" prop="processor" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:after-sale:update']">修改</el-button> -->
+          <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:after-sale:delete']">删除</el-button> -->
+          <el-button size="mini" type="text" @click="handleDetail(scope.row)">订单详情</el-button>
+          <el-button size="mini" type="text" @click="handleReceive(scope.row)">接受处理</el-button>
+          <el-button size="mini" type="text" @click="handleReject(scope.row)">驳回处理</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="550px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="售后工单号" prop="ticketNum">
+          <el-input v-model="form.ticketNum" placeholder="请输入售后工单号" />
+        </el-form-item>
+        <el-form-item label="订单编号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单编号" />
+        </el-form-item>
+        <el-form-item label="售后类型" prop="category">
+          <el-select v-model="form.category" placeholder="请选择售后类型">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_CATEGORY)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="处理状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择处理状态">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STATE)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="处理开始时间" prop="startTime">
+          <el-date-picker clearable v-model="form.startTime" type="datetime" value-format="timestamp"
+            placeholder="选择处理开始时间" />
+        </el-form-item>
+        <el-form-item label="处理结束时间" prop="endTime">
+          <el-date-picker clearable v-model="form.endTime" type="datetime" value-format="timestamp"
+            placeholder="选择处理结束时间" />
+        </el-form-item>
+        <el-form-item label="处理结果" prop="result">
+          <el-select v-model="form.result" placeholder="请选择处理结果">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_RESULT)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户评价" prop="evaluation">
+          <el-input type="textarea" v-model="form.evaluation" placeholder="请输入客户评价" />
+        </el-form-item>
+        <el-form-item label="处理人" prop="processor">
+          <el-input v-model="form.processor" placeholder="请输入处理人" />
+        </el-form-item>
+        <el-form-item label="问题描述" prop="questionDescriptive">
+          <el-input type="textarea" v-model="form.questionDescriptive" placeholder="请输入问题描述" />
+        </el-form-item>
+        <el-form-item label="问题照片" prop="questionPicture">
+          <el-input v-model="form.questionPicture" placeholder="请输入问题照片" />
+        </el-form-item>
+        <el-form-item label="工单接受人" prop="receivePerson">
+          <el-input v-model="form.receivePerson" placeholder="请输入工单接受人" />
+        </el-form-item>
+        <el-form-item label="处理方式" prop="processMethod">
+          <el-select v-model="form.processMethod" placeholder="请选择处理方式">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_METHOD)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="处理建议" prop="processRecommendation">
+          <el-input type="textarea" v-model="form.processRecommendation" 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>
+
+    <!-- 对话框(售后工单) -->
+    <el-dialog title="售后工单" :visible.sync="openDetail" width="900px" v-dialogDrag append-to-body>
+      <el-row>
+        <el-form ref="form" :model="formDetail" label-width="95px">
+          <el-col :span="12">
+            <el-form-item label="售后工单" prop="ticketNum">
+              <el-input v-model="formDetail.ticketNum" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="订单编号" prop="orderCode">
+              <el-input v-model="formDetail.orderCode" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="售后类型" prop="category">
+              <el-select v-model="formDetail.category" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_CATEGORY)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="处理状态" prop="state">
+              <el-select v-model="formDetail.state" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STATE)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="问题描述" prop="questionDescriptive">
+              <el-input type="textarea" v-model="formDetail.questionDescriptive" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="问题照片" prop="questionPicture">
+              <el-input v-model="formDetail.questionPicture" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="工单接收人" prop="receivePerson">
+              <el-input v-model="formDetail.receivePerson" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="受理时间" prop="startTime">
+              <el-date-picker v-model="formDetail.startTime" type="datetime" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="问题处理人" prop="processor">
+              <el-input v-model="formDetail.processor" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="处理方式" prop="processMethod">
+              <el-select v-model="formDetail.processMethod" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_METHOD)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="处理建议" prop="processRecommendation">
+              <el-input type="textarea" v-model="formDetail.processRecommendation" disabled />
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createAfterSale,
+  updateAfterSale,
+  deleteAfterSale,
+  getAfterSale,
+  getAfterSalePage,
+  exportAfterSaleExcel
+} from "@/api/supplier/afterSale";
+
+export default {
+  name: "AfterSale",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 售后列列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openDetail: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        ticketNum: null,
+        orderCode: null,
+        category: null,
+        state: null,
+        startTime: [],
+        endTime: [],
+        result: null,
+        evaluation: null,
+        processor: null,
+        questionDescriptive: null,
+        questionPicture: null,
+        receivePerson: null,
+        processMethod: null,
+        processRecommendation: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      formDetail: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 订单详情 */
+    handleDetail(row) {
+      this.formDetail = {};
+      const id = row.id;
+      //获得售后详情
+      getAfterSale(id).then(response => {
+        this.formDetail = response.data;
+        this.openDetail = true;
+      });
+    },
+    /** 接受处理 */
+    handleReceive(row) {
+
+    },
+    /** 驳回处理 */
+    handleReject(row) {
+
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getAfterSalePage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        ticketNum: undefined,
+        orderCode: undefined,
+        category: undefined,
+        state: undefined,
+        startTime: undefined,
+        endTime: undefined,
+        result: undefined,
+        evaluation: undefined,
+        processor: undefined,
+        questionDescriptive: undefined,
+        questionPicture: undefined,
+        receivePerson: undefined,
+        processMethod: undefined,
+        processRecommendation: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加售后信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getAfterSale(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改售后信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateAfterSale(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createAfterSale(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除售后列编号为"' + id + '"的数据项?').then(function () {
+        return deleteAfterSale(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有售后列数据项?').then(() => {
+        this.exportLoading = true;
+        return exportAfterSaleExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '售后列.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 451 - 0
src/views/supplier/billInfo/index.vue

@@ -0,0 +1,451 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="78px">
+      <el-form-item label="账单编号" prop="billCode">
+        <el-input v-model="queryParams.billCode" placeholder="请输入账单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="订单编号" prop="orderCode">
+        <el-input v-model="queryParams.orderCode" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="账单类型" prop="category">
+        <el-select v-model="queryParams.category" placeholder="请选择账单类型" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_CATEGORY)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="账单状态" prop="state">
+        <el-select v-model="queryParams.state" placeholder="请选择账单状态" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @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="['supplier:bill-info:create']">新增</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:bill-info:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-tabs type="border-card" value="2" @tab-click="handleClick">
+      <el-tab-pane label="全部" name="2">
+        <el-table v-loading="loading" :data="list">
+          <!-- <el-table-column label=" 主键id" align="center" prop="id" /> -->
+          <!-- <el-table-column label="序号" align="center">
+        <template slot-scope="scope">{{ scope.$index + 1 }}</template></el-table-column> -->
+          <el-table-column label="账单编号" align="center" prop="billCode" />
+          <el-table-column label="订单编号" align="center" prop="orderCode" />
+          <el-table-column label="账单类型" align="center" prop="category">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_CATEGORY" :value="scope.row.category" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单状态" align="center" prop="state">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单金额" align="center" prop="total" />
+          <el-table-column label="已付金额" align="center" prop="paid" />
+          <el-table-column label="未付金额" align="center" prop="unpaid" />
+          <el-table-column label="是否结清" align="center" prop="finished">
+            <template v-slot="scope">
+              <el-tag type="success" v-if="scope.row.finished == 1">是</el-tag>
+              <el-tag type="danger" v-if="scope.row.finished == 0">否</el-tag>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column> -->
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" @click="handlePay(scope.row)">账单结算</el-button>
+              <el-button size="mini" type="text" @click="handleReturn(scope.row)">退款</el-button>
+              <el-button size="mini" type="text" @click="handlePayLog(scope.row)">付款记录</el-button>
+              <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:bill-info:update']">修改</el-button> -->
+              <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:bill-info:delete']">删除</el-button> -->
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-tab-pane>
+      <el-tab-pane label="未结清" name="0">
+        <el-table v-loading="loading" :data="list">
+          <el-table-column label="账单编号" align="center" prop="billCode" />
+          <el-table-column label="订单编号" align="center" prop="orderCode" />
+          <el-table-column label="账单类型" align="center" prop="category">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_CATEGORY" :value="scope.row.category" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单状态" align="center" prop="state">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单金额" align="center" prop="total" />
+          <el-table-column label="已付金额" align="center" prop="paid" />
+          <el-table-column label="未付金额" align="center" prop="unpaid" />
+          <el-table-column label="是否结清" align="center" prop="finished">
+            <template v-slot="scope">
+              <el-tag type="success" v-if="scope.row.finished == 1">是</el-tag>
+              <el-tag type="danger" v-if="scope.row.finished == 0">否</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" @click="handlePay(scope.row)">账单结算</el-button>
+              <el-button size="mini" type="text" @click="handleReturn(scope.row)">退款</el-button>
+              <el-button size="mini" type="text" @click="handlePayLog(scope.row)">付款记录</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-tab-pane>
+      <el-tab-pane label="已结清" name="1">
+        <el-table v-loading="loading" :data="list">
+          <el-table-column label="账单编号" align="center" prop="billCode" />
+          <el-table-column label="订单编号" align="center" prop="orderCode" />
+          <el-table-column label="账单类型" align="center" prop="category">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_CATEGORY" :value="scope.row.category" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单状态" align="center" prop="state">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单金额" align="center" prop="total" />
+          <el-table-column label="已付金额" align="center" prop="paid" />
+          <el-table-column label="未付金额" align="center" prop="unpaid" />
+          <el-table-column label="是否结清" align="center" prop="finished">
+            <template v-slot="scope">
+              <el-tag type="success" v-if="scope.row.finished == 1">是</el-tag>
+              <el-tag type="danger" v-if="scope.row.finished == 0">否</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" @click="handlePay(scope.row)">账单结算</el-button>
+              <el-button size="mini" type="text" @click="handleReturn(scope.row)">退款</el-button>
+              <el-button size="mini" type="text" @click="handlePayLog(scope.row)">付款记录</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-tab-pane>
+    </el-tabs>
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="账单编号" prop="billCode">
+          <el-input v-model="form.billCode" placeholder="请输入账单编号" />
+        </el-form-item>
+        <el-form-item label="订单编号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单编号" />
+        </el-form-item>
+        <el-form-item label="账单类型" prop="category">
+          <el-select v-model="form.category" placeholder="请选择账单类型" clearable>
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_CATEGORY)" :key="dict.value" :label="dict.label"
+              :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="账单状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择账单状态" clearable>
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="dict.value" :label="dict.label"
+              :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="账单金额" prop="total">
+          <el-input-number v-model="form.total" :precision="2" :step="100" />
+        </el-form-item>
+        <el-form-item label="已付金额" prop="paid">
+          <el-input-number v-model="form.paid" :precision="2" :step="100" @change="changeUnpaid($event)" />
+        </el-form-item>
+        <el-form-item label="未付金额" prop="unpaid">
+          <el-input-number v-model="form.unpaid" :precision="2" :step="100" />
+        </el-form-item>
+        <el-form-item label="是否结清" prop="finished">
+          <el-radio-group v-model="form.finished">
+            <el-radio label="0">否</el-radio>
+            <el-radio label="1">是</el-radio>
+          </el-radio-group>
+        </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>
+
+    <!-- 对话框(付款记录) -->
+    <el-dialog title="付款记录" :visible.sync="openPayLog" width="1000px" v-dialogDrag append-to-body>
+      <el-row>
+        <el-form ref="formPayLog" :model="formPayLog" label-width="90px">
+          <el-col :span="12">
+            <el-form-item label="订单编号" prop="orderCode">
+              <el-input v-model="formPayLog.orderCode" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="账单编号" prop="billCode">
+              <el-input v-model="formPayLog.billCode" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="账单状态" prop="state">
+              <el-select v-model="formPayLog.state" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-table :data="formPayLog.list" v-loading="loadingPayLog">
+              <el-table-column label="序号" align="center" prop="id" />
+              <el-table-column label="付款方" align="center" prop="payer" />
+              <el-table-column label="付款账号" align="center" prop="payAccount" />
+              <el-table-column label="付款方式" align="center" prop="payMethod" />
+              <el-table-column label="付款金额" align="center" prop="payAmount" />
+              <el-table-column label="收款单位" align="center" prop="payee" />
+              <el-table-column label="收款账号" align="center" prop="receiveAccount" />
+              <el-table-column label="付款时间" align="center" prop="" width="150">
+                <template v-slot="scope">
+                  <span>{{ parseTime(scope.row.payTime) }}</span>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+        </el-form>
+      </el-row>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import {
+  createBillInfo,
+  updateBillInfo,
+  deleteBillInfo,
+  getBillInfo,
+  getBillInfoPage,
+  exportBillInfoExcel,
+  getPayDetailList,
+} from "@/api/supplier/billInfo";
+
+export default {
+  name: "BillInfo",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      loadingPayLog: false,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 账单列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openPayLog: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        billCode: null,
+        orderCode: null,
+        category: null,
+        state: null,
+        total: null,
+        paid: null,
+        unpaid: null,
+        finished: null,
+      },
+      // 表单参数
+      form: {},
+      formPayLog: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    handleClick(tab, event) {
+      if (tab.name == '2') {//全部
+        this.queryParams.finished = null;
+      }
+      if (tab.name == '0') {//未结清
+        this.queryParams.finished = 0;
+      }
+      if (tab.name == '1') {//已结清
+        this.queryParams.finished = 1;
+      }
+      this.getList();
+    },
+    changeUnpaid(event) {
+      this.$set(this.form, "unpaid", this.form.total - event);
+    },
+    /** 账单结算 */
+    handlePay(row) {
+
+    },
+    /** 退款 */
+    handleReturn(row) {
+
+    },
+    /** 付款记录 */
+    handlePayLog(row) {
+      this.formPayLog.orderCode = row.orderCode;
+      this.formPayLog.billCode = row.billCode;
+      this.formPayLog.state = row.state;
+      this.formPayLog.list = [];
+      this.loadingPayLog = true
+      //获取付款记录
+      getPayDetailList(row.id).then(res => {
+        this.formPayLog.list = res.data;
+        this.loadingPayLog = false;
+      })
+      this.openPayLog = true;
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getBillInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        billCode: undefined,
+        orderCode: undefined,
+        category: undefined,
+        state: undefined,
+        total: undefined,
+        paid: undefined,
+        unpaid: undefined,
+        finished: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加账单";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getBillInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改账单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateBillInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createBillInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除账单编号为"' + id + '"的数据项?').then(function () {
+        return deleteBillInfo(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有账单数据项?').then(() => {
+        this.exportLoading = true;
+        return exportBillInfoExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '账单.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 358 - 0
src/views/supplier/clientInfo/index.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="客户编号" prop="code">
+        <el-input v-model="queryParams.code" placeholder="请输入客户编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="客户名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="客户类型" prop="category">
+        <el-select v-model="queryParams.category" placeholder="请选择客户类型" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.CLIENT_CATEGORY)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="客户联系人" prop="associate">
+        <el-input v-model="queryParams.associate" placeholder="请输入客户联系人" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="是否签约" prop="contracted">
+        <el-select v-model="queryParams.contracted" placeholder="请选择是否签约" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.sureFlag" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @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="['supplier:client-info:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:client-info:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="客户编号" align="center" prop="code" />
+      <el-table-column label="客户名称" align="center" prop="name" />
+      <el-table-column label="客户类型" align="center" prop="category">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.CLIENT_CATEGORY" :value="scope.row.category" />
+        </template>
+      </el-table-column>
+      <el-table-column label="客户地址" align="center" prop="address" />
+      <el-table-column label="客户联系人" align="center" prop="associate" />
+      <el-table-column label="客户联系方式" align="center" prop="phone" />
+      <el-table-column label="成交次数" align="center" prop="dealNumber" />
+      <el-table-column label="成交总金额" align="center" prop="dealAmount" />
+      <el-table-column label="客户标签" align="center" prop="tag" />
+      <el-table-column label="是否签约" align="center" prop="contracted">
+        <template v-slot="scope">
+          <el-tag v-if="scope.row.category == 1">是</el-tag>
+          <el-tag v-if="scope.row.category == 0">否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="签约周期" align="center" prop="contractedTime" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['supplier:client-info:update']">修改</el-button>
+          <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:client-info:delete']">删除</el-button> -->
+          <el-button size="mini" type="text" @click="handleDealLog(scope.row)">交易记录</el-button>
+          <el-button size="mini" type="text" @click="handleContractLog(scope.row)">签约记录</el-button>
+          <!-- <el-button size="mini" type="text" @click="handleUpdate(scope.row)">客户跟进</el-button> -->
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="98px">
+        <el-form-item label="客户编号" prop="code">
+          <el-input v-model="form.code" 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="category">
+          <el-select v-model="form.category" placeholder="请选择客户类型">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.CLIENT_CATEGORY)" :key="parseInt(dict.value)"
+              :label="dict.label" :value="parseInt(dict.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户地址" prop="address">
+          <el-input v-model="form.address" placeholder="请输入客户地址" />
+        </el-form-item>
+        <el-form-item label="客户联系人" prop="associate">
+          <el-input v-model="form.associate" placeholder="请输入客户联系人" />
+        </el-form-item>
+        <el-form-item label="客户联系方式" prop="phone">
+          <el-input v-model="form.phone" placeholder="请输入客户联系方式" />
+        </el-form-item>
+        <el-form-item label="成交次数" prop="dealNumber">
+          <el-input-number v-model="form.dealNumber" :precision="0" :min="0" placeholder="0" />
+        </el-form-item>
+        <el-form-item label="成交总金额" prop="dealAmount">
+          <el-input-number v-model="form.dealAmount" :precision="2" :min="0" placeholder="0.00" />
+        </el-form-item>
+        <el-form-item label="客户标签" prop="tag">
+          <el-input v-model="form.tag" placeholder="请输入客户标签" />
+        </el-form-item>
+        <el-form-item label="是否签约" prop="contracted">
+          <el-select v-model="form.contracted" placeholder="请选择是否签约">
+            <el-option v-for="dict in this.sureFlag" :key="parseInt(dict.value)" :label="dict.label"
+              :value="parseInt(dict.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="签约周期" prop="contractedTime">
+          <el-input v-model="form.contractedTime" placeholder="请输入签约周期" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input type="textarea" v-model="form.remark" 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>
+
+    <!-- 对话框(交易记录) -->
+    <el-dialog title="交易记录" :visible.sync="openDealLog" width="1100px" v-dialogDrag append-to-body>
+      <el-form ref="formDealLog" :model="formDealLog" label-width="68px">
+        <el-row>
+          <el-col :span="10">
+            <el-form-item label="订单编号" prop="orderCode">
+              <el-input v-model="formDealLog.name" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <span style="text-align: right;vertical-align: middle;float: left;font-size: 14px;
+            color: #606266;font-weight: 700;margin-bottom: 20px">交易记录</span>
+            <el-table :data="formDealLog.list" v-loading="loadingDealLog">
+              <el-table-column label="订单编号" align="center" prop="" />
+              <el-table-column label="商品名称" align="center" prop="" />
+              <el-table-column label="商品品牌" align="center" prop="" />
+              <el-table-column label="商品型号" align="center" prop="" />
+              <el-table-column label="单位" align="center" prop="" />
+              <el-table-column label="单价" align="center" prop="paee" />
+              <el-table-column label="成交数量" align="center" prop="" />
+              <el-table-column label="成交金额" align="center" prop="" />
+              <el-table-column label="物流状态" align="center" prop="" />
+              <el-table-column label="付款状态" align="center" prop="" />
+              <el-table-column label="订单状态" align="center" prop="" />
+              <el-table-column label="订单日期" align="center" prop="" width="150">
+                <template v-slot="scope">
+                  <!-- <span>{{ parseTime(scope.row.payTime, "{y}-{m}-{d}") }}</span> -->
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import {
+  createClientInfo,
+  updateClientInfo,
+  deleteClientInfo,
+  getClientInfo,
+  getClientInfoPage,
+  exportClientInfoExcel
+} from "@/api/supplier/clientInfo";
+
+export default {
+  name: "ClientInfo",
+  components: {
+  },
+  data() {
+    return {
+      sureFlag: [
+        { value: '0', label: '否' },
+        { value: '1', label: '是' }
+      ],
+      // 遮罩层
+      loading: true,
+      loadingDealLog: false,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 客户管理列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openDealLog: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        code: null,
+        name: null,
+        category: null,
+        address: null,
+        associate: null,
+        phone: null,
+        dealNumber: null,
+        dealAmount: null,
+        tag: null,
+        contracted: null,
+        contractedTime: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      formDealLog: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 交易记录 */
+    handleDealLog(row) {
+      this.formDealLog = {};
+      this.formDealLog.name = row.name;
+      //获得交易记录
+      this.openDealLog = true;
+    },
+    /** 签约记录 */
+    handleContractLog(row) {
+
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getClientInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        code: undefined,
+        name: undefined,
+        category: undefined,
+        address: undefined,
+        associate: undefined,
+        phone: undefined,
+        dealNumber: undefined,
+        dealAmount: undefined,
+        tag: undefined,
+        contracted: undefined,
+        contractedTime: undefined,
+        remark: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加客户管理";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getClientInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改客户管理";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateClientInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createClientInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除客户管理编号为"' + id + '"的数据项?').then(function () {
+        return deleteClientInfo(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有客户管理数据项?').then(() => {
+        this.exportLoading = true;
+        return exportClientInfoExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '客户管理.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 375 - 0
src/views/supplier/goodsDetail/index.vue

@@ -0,0 +1,375 @@
+<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="code">
+        <el-input v-model="queryParams.code" placeholder="请输入商品编号" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入商品名称" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品品牌" prop="brand">
+        <el-input v-model="queryParams.brand" placeholder="请输入商品品牌" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入商品状态" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品类型" prop="category">
+        <el-input v-model="queryParams.category" placeholder="请输入商品类型" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="上架时间" prop="upTime">
+        <el-date-picker v-model="queryParams.upTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @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="['supplier:goods-detail:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
+                   v-hasPermi="['supplier:goods-detail:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row> -->
+
+    <el-row :gutter="10" class="mb8">
+
+    </el-row>
+    <!-- 列表 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="4">
+        <span>商品分类</span>
+        <el-tree :data="categoryOptions" :props="defaultProps" :expand-on-click-node="false"
+          :filter-node-method="filterNode" ref="tree" default-expand-all @node-click="handleNodeClick"
+          style="overflow: auto;" />
+      </el-col>
+      <el-col :span="20">
+        <el-table v-loading="loading" :data="list">
+          <el-table-column label="序号" align="center" prop="id" />
+          <el-table-column label="商品id" align="center" prop="goodsId" />
+          <el-table-column label="商品编号" align="center" prop="code" />
+          <el-table-column label="商品名称" align="center" prop="name" />
+          <el-table-column label="关键词" align="center" prop="keyword" />
+          <el-table-column label="单位" align="center" prop="unit" />
+          <el-table-column label="市场价" align="center" prop="marketPrice" />
+          <el-table-column label="平台价" align="center" prop="platPrice" />
+          <el-table-column label="商品品牌" align="center" prop="brand" />
+          <el-table-column label="库存" align="center" prop="num" />
+          <el-table-column label="商品状态" align="center" prop="state" />
+          <el-table-column label="商品类型" align="center" prop="category" />
+          <el-table-column label="销售数量" align="center" prop="saleNum" />
+          <el-table-column label="付款策略" align="center" prop="payMethod" />
+          <el-table-column label="售后策略" align="center" prop="aftersaleStrategy" />
+          <el-table-column label="价格策略" align="center" prop="priceStrategy" />
+          <el-table-column label="上架方式" align="center" prop="upMethod" />
+          <el-table-column label="上架数量" align="center" prop="upNum" />
+          <el-table-column label="上架时间" align="center" prop="upTime" width="180">
+            <template v-slot="scope">
+              <span>{{ parseTime(scope.row.upTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="是否置顶" align="center" prop="sticky" />
+          <el-table-column label="商品详情" align="center" prop="productDetail" />
+          <el-table-column label="商品封面" align="center" prop="productPhoto" />
+          <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+            <template v-slot="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                v-hasPermi="['supplier:goods-detail:update']">修改</el-button>
+              <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                v-hasPermi="['supplier:goods-detail:delete']">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-col>
+    </el-row>
+
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="商品id" prop="goodsId">
+          <el-input v-model="form.goodsId" placeholder="请输入商品id" />
+        </el-form-item>
+        <el-form-item label="商品编号" prop="code">
+          <el-input v-model="form.code" 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="keyword">
+          <el-input v-model="form.keyword" placeholder="请输入关键词" />
+        </el-form-item>
+        <el-form-item label="单位" prop="unit">
+          <el-input v-model="form.unit" placeholder="请输入单位" />
+        </el-form-item>
+        <el-form-item label="市场价" prop="marketPrice">
+          <el-input v-model="form.marketPrice" placeholder="请输入市场价" />
+        </el-form-item>
+        <el-form-item label="平台价" prop="platPrice">
+          <el-input v-model="form.platPrice" placeholder="请输入平台价" />
+        </el-form-item>
+        <el-form-item label="商品品牌" prop="brand">
+          <el-input v-model="form.brand" placeholder="请输入商品品牌" />
+        </el-form-item>
+        <el-form-item label="库存" prop="num">
+          <el-input v-model="form.num" 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="category">
+          <el-input v-model="form.category" placeholder="请输入商品类型" />
+        </el-form-item>
+        <el-form-item label="销售数量" prop="saleNum">
+          <el-input v-model="form.saleNum" placeholder="请输入销售数量" />
+        </el-form-item>
+        <el-form-item label="付款策略" prop="payMethod">
+          <el-input v-model="form.payMethod" placeholder="请输入付款策略" />
+        </el-form-item>
+        <el-form-item label="售后策略" prop="aftersaleStrategy">
+          <el-input v-model="form.aftersaleStrategy" placeholder="请输入售后策略" />
+        </el-form-item>
+        <el-form-item label="价格策略" prop="priceStrategy">
+          <el-input v-model="form.priceStrategy" placeholder="请输入价格策略" />
+        </el-form-item>
+        <el-form-item label="上架方式" prop="upMethod">
+          <el-input v-model="form.upMethod" placeholder="请输入上架方式" />
+        </el-form-item>
+        <el-form-item label="上架数量" prop="upNum">
+          <el-input v-model="form.upNum" placeholder="请输入上架数量" />
+        </el-form-item>
+        <el-form-item label="上架时间" prop="upTime">
+          <el-date-picker clearable v-model="form.upTime" type="date" value-format="timestamp" placeholder="选择上架时间" />
+        </el-form-item>
+        <el-form-item label="是否置顶" prop="sticky">
+          <el-input v-model="form.sticky" placeholder="请输入是否置顶" />
+        </el-form-item>
+        <el-form-item label="商品详情" prop="productDetail">
+          <el-input v-model="form.productDetail" placeholder="请输入商品详情" />
+        </el-form-item>
+        <el-form-item label="商品封面" prop="productPhoto">
+          <el-input v-model="form.productPhoto" 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 {
+  createGoodsDetail,
+  updateGoodsDetail,
+  deleteGoodsDetail,
+  getGoodsDetail,
+  getGoodsDetailPage,
+  exportGoodsDetailExcel
+} from "@/api/supplier/goodsDetail";
+import { getGoodsCategoryListAll, } from "@/api/supplier/goodsCategory";
+import Treeselect from '@riophae/vue-treeselect'
+
+export default {
+  name: "GoodsDetail",
+  components: {
+    Treeselect,
+  },
+  data() {
+    return {
+      categoryOptions: [],
+      defaultProps: {
+        children: 'children',
+        label: 'name'
+      },
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品详情列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        goodsId: null,
+        code: null,
+        name: null,
+        keyword: null,
+        brand: null,
+        state: null,
+        category: null,
+        upTime: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+    getGoodsCategoryListAll().then(response => {
+      this.categoryOptions = this.handleTree(response.data, "id");
+    });
+  },
+  methods: {
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true
+      return data.label.indexOf(value) !== -1
+    },
+    handleNodeClick(data) {
+      this.reset();
+      this.queryParams.category = data.id
+      this.getList()
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getGoodsDetailPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        goodsId: undefined,
+        code: undefined,
+        name: undefined,
+        keyword: undefined,
+        unit: undefined,
+        marketPrice: undefined,
+        platPrice: undefined,
+        brand: undefined,
+        num: undefined,
+        state: undefined,
+        category: undefined,
+        saleNum: undefined,
+        payMethod: undefined,
+        aftersaleStrategy: undefined,
+        priceStrategy: undefined,
+        upMethod: undefined,
+        upNum: undefined,
+        upTime: undefined,
+        sticky: undefined,
+        productDetail: undefined,
+        productPhoto: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加商品详情";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getGoodsDetail(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改商品详情";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateGoodsDetail(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createGoodsDetail(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除商品详情编号为"' + id + '"的数据项?').then(function () {
+        return deleteGoodsDetail(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有商品详情数据项?').then(() => {
+        this.exportLoading = true;
+        return exportGoodsDetailExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '商品详情.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 562 - 0
src/views/supplier/goodsInfo/index.vue

@@ -0,0 +1,562 @@
+<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="name">
+        <el-input v-model="queryParams.name" placeholder="请输入商品名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="商品类型" prop="category">
+        <el-input v-model="queryParams.category" placeholder="请输入商品类型" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="商品状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入商品状态" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @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="['supplier:goods:create']">新增</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
+                   v-hasPermi="['supplier:goods:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="序号" align="center" prop="id" />
+      <el-table-column label="商品编号" align="center" prop="code" />
+      <el-table-column label="商品名称" align="center" prop="name" />
+      <el-table-column label="商品类型" align="center" prop="category">
+        <template v-slot="scope">
+          <el-tag> {{ getCategoryName(scope.row.category) }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品单价" align="center" prop="price" />
+      <el-table-column label="付款方式" align="center" prop="payMethod">
+        <template v-slot="scope">
+          <dict-tag v-for="item in scope.row.payMethod" :type="DICT_TYPE.PAY_METHOD" :value="item" />
+        </template>
+      </el-table-column>
+      <el-table-column label="价格策略" align="center" prop="priceStrategy">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.PRICE_STRATEGY" :value="scope.row.priceStrategy" />
+        </template>
+      </el-table-column>
+      <el-table-column label="售后策略" align="center" prop="aftersaleStrategy">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_STRATEGY" :value="scope.row.aftersaleStrategy" />
+        </template>
+      </el-table-column>
+      <el-table-column label="关键词" align="center" prop="keyword">
+        <template v-slot="scope">
+          <el-tag v-for="item2 in scope.row.keyword"> {{ item2 }}</el-tag>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="商品详情" align="center" prop="productDetail" /> -->
+      <el-table-column label="商品图片" align="center" prop="picture" />
+      <el-table-column label="商品状态" align="center" prop="state">
+        <template v-slot="scope">
+          <el-switch v-model="scope.row.state" :active-value="0" :inactive-value="1"
+            @change="handleStatusChange(scope.row)" />
+        </template>
+      </el-table-column>
+
+      <!-- <el-table-column label="商品型号" align="center" prop="model" /> -->
+      <!-- <el-table-column label="商品成本" align="center" prop="cost" /> -->
+      <!-- <el-table-column label="单位" align="center" prop="unit" /> -->
+      <!-- <el-table-column label="包装方式" align="center" prop="pack" /> -->
+      <!-- <el-table-column label="自定义策略" align="center" prop="customStrategy" /> -->
+      <!-- <el-table-column label="商品参数" align="center" prop="productParameter" /> -->
+      <!-- <el-table-column label="附件1" align="center" prop="attachmentOne" /> -->
+      <!-- <el-table-column label="附件2" align="center" prop="attachmentTwo" /> -->
+      <!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+</el-table-column> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['supplier:goods:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['supplier:goods:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="90px">
+        <el-row>
+          <el-col :span="13">
+            <el-form-item label="商品编号" prop="code">
+              <el-input v-model="form.code" placeholder="自动生成" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品名称" prop="name">
+              <el-input v-model="form.name" placeholder="请输入商品名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品品牌" prop="brand">
+              <el-input v-model="form.brand" placeholder="请输入商品品牌" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品型号" prop="model">
+              <el-input v-model="form.model" placeholder="请输入商品型号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品图片" prop="picture">
+              <!-- <el-input v-model="form.picture" placeholder="请输入商品图片" /> -->
+              <imageUpload v-model="form.picture" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="商品类型" prop="category">
+              <!-- <el-input v-model="form.category" placeholder="请输入商品类型" /> -->
+              <el-cascader v-model="form.category" :options="goodsCategory" :show-all-levels="false"
+                :props="{ label: 'name', value: 'id', children: 'children', checkStrictly: true }" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="商品成本" prop="cost">
+              <el-input-number v-model="form.cost" :precision="2" :step="100" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="商品单价" prop="price">
+              <el-input-number v-model="form.price" :precision="2" :step="100" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="单位" prop="unit">
+              <el-input v-model="form.unit" placeholder="请输入单位" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="包装方式" prop="pack">
+              <el-select v-model="form.pack" placeholder="请选择包装方式" clearable>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.GOODS_PACK)" :key="dict.value" :label="dict.label"
+                  :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="付款方式" prop="payMethod">
+              <el-select v-model="form.payMethod" placeholder="请选择付款方式" multiple>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_METHOD)" :key="dict.value" :label="dict.label"
+                  :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="价格策略" prop="priceStrategy">
+              <el-select v-model="form.priceStrategy" placeholder="请选择价格策略" clearable>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PRICE_STRATEGY)" :key="dict.value"
+                  :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- 阶梯价格策略 -->
+          <el-col :span="24" v-if="form.priceStrategy == 2" style="margin-bottom: 20px;">
+            <el-table :data="priceStrategyTableData" style="width: 100%">
+              <el-table-column prop="level" align="center" label="阶梯" />
+              <el-table-column prop="condition" align="center" label="数量条件" />
+              <el-table-column prop="unit" align="center" label="单位" />
+              <el-table-column prop="category" align="center" label="策略类型" />
+              <el-table-column prop="price" align="center" label="价格/RMB(元)" />
+            </el-table>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="售后策略" prop="aftersaleStrategy">
+              <el-select v-model="form.aftersaleStrategy" placeholder="请选择售后策略" clearable>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STRATEGY)" :key="dict.value"
+                  :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="自定义策略" prop="customStrategy">
+              <el-input type="textarea" v-model="form.customStrategy" placeholder="请输入自定义策略" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="关键词" prop="keyword">
+              <!-- <el-input v-model="form.keyword" placeholder="请输入关键词" /> -->
+              <el-tag :key="tag" v-for="tag in form.keyword" closable :disable-transitions="false"
+                @close="handleClose(tag)">
+                {{ tag }}
+              </el-tag>
+              <el-input class="input-new-tag" v-if="inputVisible" v-model="inputValue" ref="saveTagInput" size="small"
+                @keyup.enter.native="handleInputConfirm" @blur="handleInputConfirm">
+              </el-input>
+              <el-button v-else class="button-new-tag" size="small" @click="showInput">+ 新 关键词</el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="商品参数" prop="productParameter">
+              <el-input type="textarea" v-model="form.productParameter" placeholder="请输入商品参数" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="商品详情" prop="productDetail">
+              <editor v-model="form.productDetail" :min-height="192" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="附件1" prop="attachmentOne">
+              <!-- <el-input v-model="form.attachmentOne" placeholder="请输入附件1" /> -->
+              <file-upload v-model="form.attachmentOne" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="附件2" prop="attachmentTwo">
+              <!-- <el-input v-model="form.attachmentTwo" placeholder="请输入附件2" /> -->
+              <file-upload v-model="form.attachmentTwo" />
+            </el-form-item>
+          </el-col>
+
+          <!-- <el-form-item label="商品状态" prop="state">
+            <el-input v-model="form.state" placeholder="请输入商品状态" />
+          </el-form-item> -->
+        </el-row>
+      </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 {
+  createGoods,
+  updateGoods,
+  deleteGoods,
+  getGoods,
+  getGoodsPage,
+  exportGoodsExcel,
+  changeGoodsStatus,
+} from "@/api/supplier/goods";
+import { getGoodsCategoryListAll, } from "@/api/supplier/goodsCategory";
+import { CommonStatusEnum } from "@/utils/constants";
+import Editor from '@/components/Editor';
+import ImageUpload from "@/components/ImageUpload/index";
+import FileUpload from "@/components/FileUpload/index";
+
+export default {
+  name: "Goods",
+  components: {
+    Editor,
+    ImageUpload,
+    FileUpload,
+  },
+  data() {
+    return {
+      goodsCategory: [],
+      categoryList: [],
+      dynamicTags: [],
+      inputVisible: false,
+      inputValue: '',
+      SysCommonStatusEnum: CommonStatusEnum,
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品列表列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        code: null,
+        name: null,
+        model: null,
+        category: null,
+        cost: null,
+        unit: null,
+        price: null,
+        state: null,
+        pack: null,
+        payMethod: null,
+        priceStrategy: null,
+        aftersaleStrategy: null,
+        customStrategy: null,
+        keyword: null,
+        productParameter: null,
+        productDetail: null,
+        attachmentOne: null,
+        attachmentTwo: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      },
+      priceStrategyTableData: [
+        { level: '1', condition: '0 ≤ 数量 ≤ 1', unit: '个', category: '固定价格', price: '¥100' },
+        { level: '2', condition: '2 ≤ 数量', unit: '个', category: '折扣/固定价格', price: '80%/¥90' },
+      ]
+    };
+  },
+  created() {
+    this.getList();
+    getGoodsCategoryListAll().then(response => {
+      this.categoryList = response.data
+      this.goodsCategory = this.handleTree(this.categoryList, "id");
+    });
+  },
+  methods: {
+    //获得商品类型名称
+    getCategoryName(category) {
+      for (const item of this.categoryList) {
+        if (item.id === category) {
+          return item.name;
+        }
+      }
+      return "未知类型";
+    },
+    // 商品状态修改
+    handleStatusChange(row) {
+      // 此时,row 已经变成目标状态了,所以可以直接提交请求和提示
+      let text = row.state === CommonStatusEnum.ENABLE ? "启用" : "停用";
+      this.$modal
+        .confirm('确认要"' + text + '""' + row.name + '"商品吗?')
+        .then(function () {
+          return changeGoodsStatus(row.id, row.state);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "成功");
+          this.getList();
+        })
+        .catch(function () {
+          // 异常时,需要将 row.status 状态重置回之前的
+          row.state =
+            row.status === CommonStatusEnum.ENABLE
+              ? CommonStatusEnum.DISABLE
+              : CommonStatusEnum.ENABLE;
+        });
+    },
+    // 关键词标签
+    handleClose(tag) {
+      this.form.keyword.splice(this.form.keyword.indexOf(tag), 1);
+    },
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick(_ => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.form.keyword.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = '';
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getGoodsPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        for (let i = 0; i < this.list.length; i++) {
+          if (this.list[i].keyword) {
+            this.list[i].keyword = this.list[i].keyword.split(",");
+          }
+        }
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        model: undefined,
+        picture: undefined,
+        category: undefined,
+        cost: undefined,
+        unit: undefined,
+        price: undefined,
+        state: undefined,
+        pack: undefined,
+        payMethod: undefined,
+        priceStrategy: undefined,
+        aftersaleStrategy: undefined,
+        customStrategy: undefined,
+        keyword: [],
+        productParameter: undefined,
+        productDetail: undefined,
+        attachmentOne: undefined,
+        attachmentTwo: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加商品列表";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getGoods(id).then(response => {
+        this.form = response.data;
+        if (this.form.keyword) {
+          this.form.keyword = this.form.keyword.split(",");
+        }
+        if (this.form.payMethod) {
+          this.form.payMethod = this.form.payMethod.split(",");
+        }
+        this.form.priceStrategy = this.form.priceStrategy + "";
+        this.form.aftersaleStrategy = this.form.aftersaleStrategy + "";
+        this.form.pack = this.form.pack + "";
+        this.open = true;
+        this.title = "修改商品列表";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (this.form.category != null && this.form.category != "" && this.form.category instanceof Array) {
+          this.form.category = this.form.category[this.form.category.length - 1];
+        }
+        if (this.form.payMethod != null) {
+          let temp = "";
+          for (let i = 0; i < this.form.payMethod.length; i++) {
+            if (!temp) {
+              temp = this.form.payMethod[i];
+            } else {
+              temp = temp + "," + this.form.payMethod[i];
+            }
+          }
+          this.form.payMethod = temp;
+        }
+        if (this.form.keyword != null) {
+          let temp = "";
+          for (let i = 0; i < this.form.keyword.length; i++) {
+            if (!temp) {
+              temp = this.form.keyword[i];
+            } else {
+              temp = temp + "," + this.form.keyword[i];
+            }
+          }
+          this.form.keyword = temp;
+        }
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateGoods(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createGoods(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除商品列表编号为"' + id + '"的数据项?').then(function () {
+        return deleteGoods(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有商品列表数据项?').then(() => {
+        this.exportLoading = true;
+        return exportGoodsExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '商品列表.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>
+
+<style>
+.el-tag+.el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+</style>

+ 261 - 0
src/views/supplier/receiveLog/index.vue

@@ -0,0 +1,261 @@
+<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="orderCode">
+        <el-input v-model="queryParams.orderCode" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="账单编号" prop="billCode">
+        <el-input v-model="queryParams.billCode" placeholder="请输入账单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="账单状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入账单状态" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @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="['supplier:deal-log:create']">新增</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:deal-log:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list" row-key="id" @expand-change="expandChange">
+      <el-table-column type="expand">
+        <template slot-scope="props">
+          <el-table :data="props.row.childrenData" v-loading="props.row.loading" border
+            style="margin-left: 60px;width: 95%; height:100%">
+            <el-table-column label="收款方" align="center" prop="payee" />
+            <el-table-column label="收款账号" align="center" prop="receiveAccount" />
+            <el-table-column label="收款金额" align="center" prop="receiveAmount" />
+            <el-table-column label="付款方" align="center" prop="payer" />
+            <el-table-column label="付款账号" align="center" prop="payAccount" />
+            <el-table-column label="付款方式" align="center" prop="payMethod" />
+            <el-table-column label="收款时间" align="center" prop="payTime">
+              <template v-slot="scope">
+                <span>{{ parseTime(scope.row.payTime) }}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </template>
+      </el-table-column>
+      <el-table-column label="订单编号" align="center" prop="orderCode" />
+      <el-table-column label="账单编号" align="center" prop="billCode" />
+      <el-table-column label="账单状态" align="center" prop="state">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:deal-log:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:deal-log:delete']">删除</el-button>
+        </template>
+      </el-table-column> -->
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="订单编号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单编号" />
+        </el-form-item>
+        <el-form-item label="账单编号" prop="billCode">
+          <el-input v-model="form.billCode" placeholder="请输入账单编号" />
+        </el-form-item>
+        <el-form-item label="账单状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择账单状态" clearable>
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="dict.value" :label="dict.label"
+              :value="dict.value" />
+          </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 {
+  createReceiveLog,
+  updateReceiveLog,
+  deleteReceiveLog,
+  getReceiveLog,
+  getReceiveLogPage,
+  exportReceiveLogExcel,
+  getReceiveDetailList
+} from "@/api/supplier/receiveLog";
+
+export default {
+  name: "DealLog",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 交易记录列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        orderCode: null,
+        billCode: null,
+        state: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取子层表格数据并更新allRules数据
+    expandChange(row, expandedRows) {
+      if (!row.children) {
+        // 通过$set属性可设置loading实现实时加载loading效果
+        //(经过测试,通过$set直接给父层数据声明子层数据时会出现报错,所以才在获取父层表格数据时声明子层表格数据)
+        this.$set(row, 'loading', true);
+        getReceiveDetailList(row.id).then((response) => {
+          row.childrenData = response.data || [];
+          this.$set(row, 'loading', false);
+        }, (err) => {
+          this.$set(row, 'loading', false);
+        });
+      }
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getReceiveLogPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        orderCode: undefined,
+        billCode: undefined,
+        state: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加交易记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getReceiveLog(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改交易记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateReceiveLog(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createReceiveLog(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除交易记录编号为"' + id + '"的数据项?').then(function () {
+        return deleteReceiveLog(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有交易记录数据项?').then(() => {
+        this.exportLoading = true;
+        return exportReceiveLogExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '交易记录.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 312 - 0
src/views/supplier/signingInfo/index.vue

@@ -0,0 +1,312 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="签约客户" prop="client">
+        <el-input v-model="queryParams.client" placeholder="请输入签约客户" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="签约供应商" prop="supplier">
+        <el-input v-model="queryParams.supplier" placeholder="请输入签约供应商" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="签约时间" prop="signTime">
+        <el-date-picker v-model="queryParams.signTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss"
+          type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+          :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item label="签约状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入签约状态" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @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="['supplier:signing-info:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:signing-info:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="签约编号" align="center" prop="code" />
+      <el-table-column label="签约客户" align="center" prop="client" />
+      <el-table-column label="签约供应商" align="center" prop="supplier" />
+      <el-table-column label="签约时间" align="center" prop="signTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.signTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="生效时间" align="center" prop="enableTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.enableTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="开始时间" align="center" prop="startTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.startTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="结束时间" align="center" prop="endTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.endTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="签约状态" align="center" prop="state">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.SIGNING_STATE" :value="scope.row.state" />
+        </template>
+      </el-table-column>
+      <el-table-column label="签约次数" align="center" prop="number" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:signing-info:update']">修改</el-button> -->
+          <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:signing-info:delete']">删除</el-button> -->
+          <el-button size="mini" type="text" @click="handleEnd(scope.row)">终止签约</el-button>
+          <el-button size="mini" type="text" @click="handleContinue(scope.row)">到期续约</el-button>
+          <el-button size="mini" type="text" @click="handleChange(scope.row)">签约变更</el-button>
+          <el-button size="mini" type="text" @click="handleLog(scope.row)">签约记录</el-button>
+          <el-button size="mini" type="text" @click="handleAttachment(scope.row)">签约附件</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="90px">
+        <el-form-item label="签约编号" prop="code">
+          <el-input v-model="form.code" placeholder="请输入签约编号" />
+        </el-form-item>
+        <el-form-item label="签约客户" prop="client">
+          <el-input v-model="form.client" placeholder="请输入签约客户" />
+        </el-form-item>
+        <el-form-item label="签约供应商" prop="supplier">
+          <el-input v-model="form.supplier" placeholder="请输入签约供应商" />
+        </el-form-item>
+        <el-form-item label="签约时间" prop="signTime">
+          <el-date-picker clearable v-model="form.signTime" type="date" value-format="timestamp" placeholder="选择签约时间" />
+        </el-form-item>
+        <el-form-item label="生效时间" prop="enableTime">
+          <el-date-picker clearable v-model="form.enableTime" type="date" value-format="timestamp"
+            placeholder="选择生效时间" />
+        </el-form-item>
+        <el-form-item label="开始时间" prop="startTime">
+          <el-date-picker clearable v-model="form.startTime" type="date" value-format="timestamp"
+            placeholder="选择开始时间" />
+        </el-form-item>
+        <el-form-item label="结束时间" prop="endTime">
+          <el-date-picker clearable v-model="form.endTime" type="date" value-format="timestamp" placeholder="选择结束时间" />
+        </el-form-item>
+        <el-form-item label="签约状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择签约状态">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.SIGNING_STATE)" :key="parseInt(dict.value)"
+              :label="dict.label" :value="parseInt(dict.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="签约次数" prop="number">
+          <el-input-number v-model="form.number" :precision="0" :min="0" placeholder="0" />
+        </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 {
+  createSigningInfo,
+  updateSigningInfo,
+  deleteSigningInfo,
+  getSigningInfo,
+  getSigningInfoPage,
+  exportSigningInfoExcel
+} from "@/api/supplier/signingInfo";
+
+export default {
+  name: "SigningInfo",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 签约管理列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        code: null,
+        client: null,
+        supplier: null,
+        signTime: [],
+        enableTime: [],
+        startTime: [],
+        endTime: [],
+        state: null,
+        number: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 终止签约 */
+    handleEnd(row) {
+
+    },
+    /** 到期续约 */
+    handleContinue(row) {
+
+    },
+    /** 签约变更 */
+    handleChange(row) {
+
+    },
+    /** 签约记录 */
+    handleLog(row) {
+
+    },
+    /** 签约附件 */
+    handleAttachment(row) {
+
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getSigningInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        code: undefined,
+        client: undefined,
+        supplier: undefined,
+        signTime: undefined,
+        enableTime: undefined,
+        startTime: undefined,
+        endTime: undefined,
+        state: undefined,
+        number: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加签约管理";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getSigningInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改签约管理";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateSigningInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createSigningInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除签约管理编号为"' + id + '"的数据项?').then(function () {
+        return deleteSigningInfo(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有签约管理数据项?').then(() => {
+        this.exportLoading = true;
+        return exportSigningInfoExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '签约管理.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>