From f08c38b9cb4e1ac4185a98d21c9ad2696bd8a633 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期五, 24 一月 2025 16:17:39 +0800
Subject: [PATCH] 添加丹灵销售分析页面

---
 src/views/purchase/danlingPerson.vue |  446 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/api/productPurchaseSearch.js     |   11 +
 2 files changed, 457 insertions(+), 0 deletions(-)

diff --git a/src/api/productPurchaseSearch.js b/src/api/productPurchaseSearch.js
index 69f5a98..9137e8d 100644
--- a/src/api/productPurchaseSearch.js
+++ b/src/api/productPurchaseSearch.js
@@ -14,6 +14,17 @@
     })
 }
 
+export function getDLPersonListData(data) {
+    return request({
+        headers:{
+            'Authorization': getToken()
+        },
+        url: process.env.BASE_API+'/order/danLingSaleRecord4',
+        method: 'post',
+        data:data
+    })
+}
+
 export function getCityInOut(data) {
     return request({
         headers:{
diff --git a/src/views/purchase/danlingPerson.vue b/src/views/purchase/danlingPerson.vue
new file mode 100644
index 0000000..b05ba4e
--- /dev/null
+++ b/src/views/purchase/danlingPerson.vue
@@ -0,0 +1,446 @@
+<template>
+    <div class="app-container">
+        <div class="filter-container">
+
+            <div style="display: block;">
+                <div class="basic_search" style="padding-top: 10px;">
+                    <span>按照时间查询:</span>
+                    <el-date-picker
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        v-model="validTime"
+                        type="daterange"
+                        :default-time="['00:00:00','23:59:59']"
+                        :picker-options="pickerOptions"
+                        range-separator="-"
+                        start-placeholder="开始日期"
+                        end-placeholder="结束日期"
+                    >
+                    </el-date-picker>
+                </div>
+
+                <div class="basic_search" style="padding-top: 10px;margin-left: 20px" >
+                    <span>是否需上传身份证:</span>
+                    <el-select v-model="listQuery.filter.isNeedUploadPhoto" placeholder="请选择" style="width:100px">
+                        <el-option
+                            v-for="item in options"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                        </el-option>
+                    </el-select>
+                </div>
+            </div>
+            <div style="margin-top: 10px;">
+<!--                <div style="display: block">-->
+<!--                    <div class="basic_search">-->
+<!--                        <span>区域:</span>-->
+<!--                        <el-select v-model="listQuery.filter.province" clearable filterable size="small" @change="changeArea('province')">-->
+<!--                            <el-option-->
+<!--                                v-for="item in provinceList"-->
+<!--                                :key="item.id"-->
+<!--                                :label="item.name"-->
+<!--                                :value="item.name"-->
+<!--                            >-->
+<!--                            </el-option>-->
+<!--                        </el-select>-->
+<!--                    </div>-->
+<!--                    <div class="basic_search">-->
+<!--                        <el-select v-model="listQuery.filter.city" prop="city" clearable filterable size="small" @change="changeArea('city')">-->
+<!--                            <el-option-->
+<!--                                v-for="item in cityList"-->
+<!--                                :key="item.id"-->
+<!--                                :label="item.name"-->
+<!--                                :value="item.name"-->
+<!--                            >-->
+<!--                            </el-option>-->
+<!--                        </el-select>-->
+<!--                    </div>-->
+<!--                    <div class="basic_search">-->
+<!--                        <el-select v-model="listQuery.filter.district" clearable filterable size="small" @change="changeArea('district')">-->
+<!--                            <el-option-->
+<!--                                v-for="item in districtList"-->
+<!--                                :key="item.id"-->
+<!--                                :label="item.name"-->
+<!--                                :value="item.name"-->
+<!--                            >-->
+<!--                            </el-option>-->
+<!--                        </el-select>-->
+<!--                    </div>-->
+<!--                    <div class="basic_search">-->
+<!--                        <el-select v-model="listQuery.filter.street"clearable filterable size="small" @change="changeArea('street')" >-->
+<!--                            <el-option-->
+<!--                                v-for="item in streetList"-->
+<!--                                :key="item.id"-->
+<!--                                :label="item.name"-->
+<!--                                :value="item.name"-->
+<!--                            >-->
+<!--                            </el-option>-->
+<!--                        </el-select>-->
+<!--                    </div>-->
+<!--                    <div class="basic_search">-->
+<!--                        <el-select v-model="listQuery.filter.committee" size="small" clearable filterable>-->
+<!--                            <el-option-->
+<!--                                v-for="item in committeeList"-->
+<!--                                :key="item.id"-->
+<!--                                :label="item.name"-->
+<!--                                :value="item.name"-->
+<!--                            >-->
+<!--                            </el-option>-->
+<!--                        </el-select>-->
+<!--                    </div>-->
+<!--                </div>-->
+            <div style="display: block;margin-top: 10px">
+                <div class="basic_search" >
+                    <span>购买人身份证:</span>
+                    <el-input filterable clearable v-model="listQuery.filter.identify"  size="small" style="width:200px">
+                    </el-input>
+                </div>
+                <div class="basic_search" style="margin-left: 15px">
+                    <span>产品流向码:</span>
+                    <el-input filterable clearable v-model="listQuery.filter.directioncode" size="small"  style="width:200px">
+                    </el-input>
+                </div>
+                <div class="basic_search" style="margin-left: 15px">
+                    <span>民族:</span>
+                    <el-input filterable clearable v-model="listQuery.filter.nation" size="small"  style="width:200px">
+                    </el-input>
+                </div>
+            </div>
+
+            <div style="margin-top: 10px">
+                <div class="basic_search" style="margin-left: 15px">
+                    <span>按企业名称:</span>
+                    <el-input filterable clearable v-model="listQuery.filter.enterprisename" size="small"  style="width:200px">
+                    </el-input>
+                </div>
+                <div class="basic_search" >
+                    <el-button style="margin-left: 10px;" type="primary" @click="reset()" size="small">重置</el-button>
+                    <el-button style="margin-left: 10px;" type="primary" icon="el-icon-search" @click="searchProductSearch('查询','')" size="small">查询</el-button>
+                    <el-button style="margin-left: 10px;" type="primary" icon="el-icon-download" @click="exportToExcel" v-long-re-click size="small">导出</el-button>
+                </div>
+
+            </div>
+            </div>
+        </div>
+        <div class="table_content">
+            <el-table
+                v-loading="listLoading"
+                :key="tableKey"
+                :data="personPurchaseData"
+                border
+                fit
+                highlight-current-row
+                style="width: 100%;"
+            >
+                <el-table-column label="序号" type="index" align="center" width="60"/>
+                <el-table-column label="地区" prop="city" align="center" width="150">
+                </el-table-column>
+                <el-table-column label="公司名称" prop="enterprisename" align="center"  width="200">
+                </el-table-column>
+                <el-table-column label="公司编号" prop="companynumber" align="center">
+                </el-table-column>
+                <el-table-column label="购买人姓名" prop="name" align="center">
+                </el-table-column>
+                <el-table-column label="民族" prop="nation" align="center">
+                </el-table-column>
+                <el-table-column label="购买人身份证" prop="identify" align="center"  width="200">
+                </el-table-column>
+                <el-table-column label="购买数量(挂、个)" prop="num" align="center" width="100">
+                </el-table-column>
+                <el-table-column label="退货数量(挂、个)" prop="returnnum" align="center" width="100">
+                </el-table-column>
+                <el-table-column label="最近购买时间" prop="saletime" align="center" width="200">
+                    <template slot-scope="scope">
+                        <span>{{scope.row.saletime | formatDate}}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="证件照" align="center">
+                    <template slot-scope="scope">
+                        <el-image
+                            v-if="scope.row.path !== null"
+                            style="width: 66px; height: 66px"
+                            :src="scope.row.path"
+                            :preview-src-list="previewList">
+                        </el-image>
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width">
+                    <template slot-scope="scope">
+                        <!--            <el-button type="text" @click="showEditHandle(scope.row)">编辑</el-button>-->
+                        <el-button type="text" @click="showPurchaseDetail(scope.row)" v-if="scope.row.companynumber !== undefined">查看</el-button>
+                        <el-button type="text" @click="showUploadDialogHandler(scope.row.identify)"  v-if="Cookies.get('isSupervision') !=='null'">上传</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <br>
+            <el-pagination
+                v-show="recordTotal>0"
+                :current-page="currentPage"
+                :page-sizes="[20, 50, 100, 200]"
+                :page-size="pageSize"
+                :total="recordTotal"
+                layout="total, sizes, prev, pager, next, jumper"
+                background
+                style="float:right;"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+            />
+            <br>
+        </div>
+        <el-dialog
+            title="提示"
+            center
+            :visible.sync="reClickTip"
+            width="50%">
+            <span style="color: red">由于导出数据量大,请各监管单位导出数据时不要连续点击,导出按钮已限制30s内只允许点击一次。</span>
+            <span slot="footer" class="dialog-footer">
+            <el-button @click="reClickTip = false">取 消</el-button>
+            <el-button type="primary" @click="reClickTip = false">确 定</el-button>
+          </span>
+        </el-dialog>
+        <personPurchaseDetail ref="person"></personPurchaseDetail>
+        <upload-dialog ref="upload" @refresh="refresh"></upload-dialog>
+    </div>
+</template>
+
+<script>
+import personPurchaseDetail from './personPurchaseDetail/index'
+import { computePageCount } from "../../utils";
+import {exportPerson, getDLPersonListData, getPersonListData} from "../../api/productPurchaseSearch";
+import {getCityListData, getProvinceListData , } from "../../api/area";
+import uploadDialog from "./customerPhoto/index";
+import Cookies from "js-cookie";
+
+export default {
+    name: "person",
+    data(){
+        return{
+            tableKey:'',
+            validTime:['',''],
+            reClickTip: false,
+            listQuery: {
+                pageSize:10,
+                pageIndex:1,
+                filter: {
+                    starttime: '',
+                    endtime: '',
+                    identify: '',
+                    enterprisename: '',
+                    directioncode:'',
+                    isNeedUploadPhoto:'',
+                    nation:''
+                },
+            },
+            Cookies:Cookies,
+            pageSize: 20,
+            recordTotal: 0,
+            currentPage: 1,
+            pageTotal: 0,
+            listLoading:false,
+            personPurchaseData:[],
+            previewList:[],
+          options: [
+            { label: '全部', value: '' },
+            { label: '是', value:1 },
+            { label: '否', value: -1 }
+          ],
+          pickerOptions: {
+            shortcuts: [{
+              text: '最近一周',
+              onClick(picker) {
+                const end = new Date();
+                const start = new Date();
+                start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+                picker.$emit('pick', [start, end]);
+              }
+            }, {
+              text: '最近一个月',
+              onClick(picker) {
+                const end = new Date();
+                const start = new Date();
+                start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+                picker.$emit('pick', [start, end]);
+              }
+            }]
+          },
+        }
+    },
+    components:{
+      personPurchaseDetail,
+      uploadDialog
+    },
+    created() {
+      this.initValidTime()
+      this.getPersonProductList()
+    },
+    watch: {
+    },
+    methods:{
+        async getPersonProductList(){
+            this.listLoading = true
+            if( this.validTime !== null ){
+                this.listQuery.filter.starttime = this.validTime[0]
+                this.listQuery.filter.endtime = this.validTime[1]
+            }else{
+                this.listQuery.filter.starttime = ''
+                this.listQuery.filter.endtime = ''
+            }
+            let res = await getDLPersonListData(this.listQuery)
+            let data = JSON.parse(Base64.decode(res.data))
+            if(data.code === "200"){
+                this.recordTotal = data.result.total
+                this.pageSize = data.result.size
+                this.pageTotal = computePageCount(data.result.total, data.result.size)
+                this.currentPage = data.result.current
+                data.result.records.map(item => item.path = (item.path === undefined ? null : process.env.IMG_API + item.path))
+                this.previewList = data.result.records.map(item => item.path).filter(item=>item !== null)
+                this.personPurchaseData = data.result.records
+            }else{
+                this.$message({
+                    type:'warning',
+                    message:res.data.message
+                })
+            }
+            this.listLoading = false
+        },
+
+        showPurchaseDetail(val){
+            this.$refs.person.openPersonPurchaseDetail(this.listQuery.filter.starttime,this.listQuery.filter.endtime,val.identify,val.companynumber,this.listQuery.filter.directioncode)
+        },
+      showUploadDialogHandler(idCard) {
+          this.$refs.upload.showDialog(idCard)
+      },
+      refresh(){
+        this.getPersonProductList()
+      },
+
+        async exportToExcel(){
+            this.reClickTip = true
+            if( this.validTime !== null ){
+                this.listQuery.filter.starttime = this.validTime[0]
+                this.listQuery.filter.endtime = this.validTime[1]
+            }else{
+                this.listQuery.filter.starttime = ''
+                this.listQuery.filter.endtime = ''
+            }
+            let res = await exportPerson(this.listQuery)
+            if(res.data.code === '200'){
+                this.reClickTip = false
+                if(res.data.result === null ||res.data.result === [] || res.data.result.length === 0){
+                    this.$message({
+                        type:'warning',
+                        message:'无数据可导出'
+                    })
+                }else{
+                    let allData = res.data.result
+                    import('@/vendor/Export2Excel').then((excel) => {
+                        const tHeader = [
+                            '地区',
+                            '公司名称',
+                            '购买人姓名',
+                            '民族',
+                            '购买人身份证',
+                            '购买数量(挂、个)',
+                            '退货数量(挂、个)',
+                            '最近购买时间',
+                        ]
+                        // const filterVal = [
+                        //     'province',
+                        //     'enterprisename',
+                        //     'companynumber',
+                        //     'name',
+                        //     'identify',
+                        //     'num',
+                        //     'returnnum',
+                        //     'saletime',
+                        // ]
+                        const data = allData.map(item =>{
+                            return [
+                                item.city,
+                                item.enterprisename,
+                                item.name,
+                                item.nation,
+                                item.identify,
+                                item.num,
+                                item.returnnum,
+                                item.saletime,
+                            ]
+                        })
+                        excel.export_json_to_excel({
+                            header: tHeader,
+                            data,
+                            filename: '实名销售分析'
+                        })
+                    })
+                }
+
+            }else{
+                this.$message({
+                    message:res.data.message,
+                    type:'warning'
+                })
+            }
+        },
+
+        formatJson(filterVal, jsonData) {
+            return jsonData.map(v => filterVal.map(j => v[j]))
+        },
+
+        reset(){
+            this.listQuery= {
+                pageSize:10,
+                pageIndex:1,
+                filter: {
+                    starttime: '',
+                    endtime: '',
+                    identify: '',
+                    enterprisename: '',
+                    directioncode:'',
+                    isNeedUploadPhoto:'',
+                    nation:''
+                },
+            }
+            this.validTime = ['', '']
+            this.initValidTime()
+            this.getPersonProductList()
+        },
+
+        searchProductSearch(){
+            this.listQuery.pageIndex = 1
+            const date1 = new Date(this.validTime[0]);
+            const date2 = new Date(this.validTime[1]);
+            const differenceInMs = Math.abs(date2 - date1);
+            const differenceInDays = differenceInMs / (1000 * 60 * 60 * 24)
+            if(differenceInDays > 32){
+                this.$message({
+                    type: 'warning',
+                    message: '时间跨度超过一个月的,请联系管理员查询数据'
+                })
+                return
+            }
+            this.getPersonProductList()
+        },
+
+        handleSizeChange(val) {
+            this.listQuery.pageSize = val
+            this.getPersonProductList()
+        },
+        handleCurrentChange(val) {
+            this.listQuery.pageIndex = val
+            this.getPersonProductList()
+        },
+      initValidTime(){
+          const end = new Date();
+          this.validTime[0] = end.toISOString().slice(0, 10) + " 00:00:00";
+          this.validTime[1] = end.toISOString().slice(0, 10) + " 23:59:59";
+      }
+    },
+}
+</script>
+
+<style scoped>
+.basic_search{
+    display:inline-block;
+}
+
+</style>

--
Gitblit v1.9.2