huangxw 10 miesięcy temu
rodzic
commit
1f69129d1a

+ 16 - 0
src/api/price/report/index.ts

@@ -0,0 +1,16 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+
+/**
+ * 查询产地价格发布记录详情列表
+ * @param query
+ * @returns {*}
+ */
+
+export const originPriceDetail = (query?: any): any => {
+    return request({
+        url: '/dgtmedicine/originPriceDetail/list',
+        method: 'get',
+        params: query
+    });
+};

+ 38 - 1
src/api/price/station/index.ts

@@ -33,7 +33,7 @@ export const queryOriginCpyCount = (query?: any): any => {
  */
  */
 export const listByPage = (query?: any): any => {
 export const listByPage = (query?: any): any => {
     return request({
     return request({
-        url: '/company/listByPage',
+        url: 'dgtmedicine/originCpy/chooseOriginCpy',
         method: 'get',
         method: 'get',
         params: query
         params: query
     });
     });
@@ -50,3 +50,40 @@ export const addOriginCpy = (query?: any): any => {
         data: query
         data: query
     });
     });
 };
 };
+
+/**
+ * 批量删除检测点
+ * @param query
+ * @returns {*}
+ */
+export const deleteOriginCpy = (query?: any): any => {
+    return request({
+        url: '/dgtmedicine/originCpy/delOriginCpy',
+        method: 'post',
+        data: query
+    });
+};
+/**
+ * 批量修改检测点有效期
+ * @param query
+ * @returns {*}
+ */
+export const updateOriginCpy = (query?: any): any => {
+    return request({
+        url: '/dgtmedicine/originCpy/editValidDate',
+        method: 'post',
+        data: query
+    });
+};
+
+/**
+ * 获取产地检测点详细信息
+ * @param query
+ * @returns {*}
+ */
+export const originCpyInfo = (id?: any): any => {
+    return request({
+        url: `/dgtmedicine/originCpy/getInfo/${id}`,
+        method: 'get'
+    });
+};

+ 5 - 2
src/views/dgtmedicine/model/EditVipEndDate.vue

@@ -47,8 +47,11 @@ const close = () => {
 const submitForm = async () => {
 const submitForm = async () => {
     try {
     try {
         await formRef.value?.validate();
         await formRef.value?.validate();
-        const res = await editValidityDate({ ...form.value, id: props.info?.id });
-        if (res) {
+        proxy?.$modal.loading('修改中...');
+        const res = await editValidityDate({ ...form.value, id: props.info?.id }).finally(() => {
+            proxy?.$modal.closeLoading();
+        });
+        if (res?.code === 200) {
             close();
             close();
             emit('success', true);
             emit('success', true);
         }
         }

+ 75 - 0
src/views/price/models/EditStationEndDate.vue

@@ -0,0 +1,75 @@
+<template>
+    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="100">
+        <template #default>
+            <el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
+                <div class="mb-10 f-s-14 c-333 f-w-5">
+                    修改企业:
+                    <span class="c-primary">{{ mapInfoToNameString(infos) }}</span>
+                </div>
+                <el-form-item label="有效期至:" prop="endDate">
+                    <el-date-picker v-model="form.endDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择有效期" clearable style="width: 100%"></el-date-picker>
+                </el-form-item>
+            </el-form>
+        </template>
+        <template #footer>
+            <el-button @click="close">取消</el-button>
+            <el-button type="primary" @click="submitForm">确认修改</el-button>
+        </template>
+    </vxe-modal>
+</template>
+
+<script setup name="EditStationEndDate" lang="ts">
+import { updateOriginCpy } from '@/api/price/station';
+import { propTypes } from '@/utils/propTypes';
+import { FormInstance } from 'element-plus';
+const emit = defineEmits(['update:show', 'close', 'success']);
+const props = defineProps({
+    show: propTypes.bool.def(false),
+    title: propTypes.string.def('修改监测点有效期'),
+    width: propTypes.number.def(560),
+    infos: propTypes.any.def(null),
+    dict: propTypes.object.def({}),
+});
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const dialogVisible = ref(false);
+const form = ref<any>({
+    endDate: ''
+});
+const rules = reactive({
+    endDate: [{ required: true, message: '请选择有效期', trigger: 'change' }],
+})
+const formRef = ref<FormInstance>();
+const close = () => {
+    formRef.value?.resetFields();
+    emit('update:show', false);
+    emit('close', false);
+};
+const submitForm = async () => {
+    try {
+        await formRef.value?.validate();
+        const ids = props?.infos.map((item: any) => item.id);
+        proxy?.$modal.loading('修改中...');
+        const res = await updateOriginCpy({ ...form.value, ids }).finally(() => {
+            proxy?.$modal.closeLoading();
+        });
+        if (res?.code === 200) {
+            proxy?.$modal.msgSuccess('修改成功');
+            close();
+            emit('success', true);
+        }
+    } catch (error) {
+        console.error(error);
+    }
+};
+// mapInfoToNameString
+const mapInfoToNameString = (infos: any[]) => {
+    return infos.map((item) => item.cpyName).join('、');
+};
+watch(
+    () => props.show,
+    (val) => {
+        dialogVisible.value = val;
+    },
+    { immediate: true }
+);
+</script>

+ 18 - 9
src/views/price/models/addStation.vue

@@ -2,14 +2,25 @@
     <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width">
     <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width">
         <template #default>
         <template #default>
             <div class="d-flex flex-cln" style="height: 60vh;">
             <div class="d-flex flex-cln" style="height: 60vh;">
-                <div class="flex1 ov-hd" style="height:50vh">
-                    <vxe-table ref="tableRef" :loading="loading" border :data="list" height="auto" :column-config="{ resizable: true }" :row-config="{keyField: 'id',isCurrent: true, isHover: true}" :checkbox-config="{ highlight: true, range: true, trigger: 'row', reserve: true }">
+                <div class="pd-16">
+                    <el-form ref="queryFormRef" :model="queryParams" inline>
+                        <el-form-item label="企业名称">
+                            <el-input v-model="queryParams.cpyName" placeholder="请输入企业名称" clearable />
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button type="primary" @click="handleQuery">查询</el-button>
+                            <el-button @click="resetQuery">重置</el-button>
+                        </el-form-item>
+                    </el-form>
+                </div>
+                <div class="flex1 ov-hd">
+                    <vxe-table ref="tableRef" :loading="loading" border :data="list" height="auto" :column-config="{ resizable: true }" :row-config="{ keyField: 'id', isCurrent: true, isHover: true }" :checkbox-config="{ highlight: true, range: true, trigger: 'row', reserve: true }">
                         <vxe-column type="checkbox" width="60"></vxe-column>
                         <vxe-column type="checkbox" width="60"></vxe-column>
                         <vxe-column type="seq" width="60" title="序号" align="center" />
                         <vxe-column type="seq" width="60" title="序号" align="center" />
                         <!-- 企业名称 -->
                         <!-- 企业名称 -->
                         <vxe-column title="企业名称" field="cpyName" min-width="100" :formatter="colNoData" />
                         <vxe-column title="企业名称" field="cpyName" min-width="100" :formatter="colNoData" />
                         <!-- 会员级别 -->
                         <!-- 会员级别 -->
-                        <vxe-column title="会员级别" field="vipLevel" min-width="100" :formatter="colNoData" />
+                        <vxe-column title="会员级别" field="vipLevelName" min-width="100" :formatter="colNoData" />
                         <!-- 企业地址 -->
                         <!-- 企业地址 -->
                         <vxe-column title="企业地址" min-width="100" :formatter="colNoData">
                         <vxe-column title="企业地址" min-width="100" :formatter="colNoData">
                             <template #default="{ row }">{{ row.regionCodeName }}{{ row.address }}</template>
                             <template #default="{ row }">{{ row.regionCodeName }}{{ row.address }}</template>
@@ -45,9 +56,9 @@ const props = defineProps({
     title: propTypes.string.def('添加监测点'),
     title: propTypes.string.def('添加监测点'),
     width: propTypes.number.def(1200),
     width: propTypes.number.def(1200),
     show: propTypes.bool.def(false)
     show: propTypes.bool.def(false)
-})
+});
 const dialogVisible = ref(false);
 const dialogVisible = ref(false);
-const { query }: any = useRoute()
+const { query }: any = useRoute();
 const router = useRouter();
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const list = ref<any[]>([]);
 const list = ref<any[]>([]);
@@ -59,9 +70,7 @@ const data = reactive<any>({
         endDate: ''
         endDate: ''
     },
     },
     rules: {
     rules: {
-        endDate: [
-            { required: true, message: '请选择监测点有效期至', trigger: 'blur' }
-        ]
+        endDate: [{ required: true, message: '请选择监测点有效期至', trigger: 'blur' }]
     },
     },
     queryParams: {
     queryParams: {
         pageNum: 1,
         pageNum: 1,
@@ -115,7 +124,7 @@ const submitForm = async () => {
     const res = await addOriginCpy({ cpyIds, endDate: form.value?.endDate }).finally(() => {
     const res = await addOriginCpy({ cpyIds, endDate: form.value?.endDate }).finally(() => {
         proxy?.$modal.closeLoading();
         proxy?.$modal.closeLoading();
     });
     });
-    if (!res || res.code !== 200) return
+    if (!res || res.code !== 200) return;
     proxy?.$modal.msgSuccess('提交成功');
     proxy?.$modal.msgSuccess('提交成功');
     emit('sueccess', true);
     emit('sueccess', true);
     close();
     close();

+ 2 - 0
src/views/price/models/index.ts

@@ -1 +1,3 @@
 export { default as addStation } from './addStation.vue'; // 添加监测点
 export { default as addStation } from './addStation.vue'; // 添加监测点
+export { default as EditStationEndDate } from './EditStationEndDate.vue'; // 批量修改有效期
+export { default as priceRepordLog } from './priceRepordLog.vue'; // 监测点上报数据明细

+ 71 - 0
src/views/price/models/priceRepordLog.vue

@@ -0,0 +1,71 @@
+<template>
+    <div>
+        <vxe-table :loading="loading" border :data="list">
+            <!-- 序号 -->
+            <vxe-column type="seq" width="60" title="序号" align="center" />
+            <!-- 品名 -->
+            <vxe-column title="品名" field="varietyName" min-width="100" :formatter="colNoData" />
+            <!-- 规格 -->
+            <vxe-column title="规格" field="specification" min-width="100" :formatter="colNoData" />
+            <!-- 产地 -->
+            <vxe-column title="产地价格(元/kg)" field="price" min-width="100" />
+            <vxe-column title="对比近7天价格" min-width="100">
+                <template #default="{ row }">{{ row.growthRate }}%</template>
+            </vxe-column>
+            <vxe-column title="积分" field="points" width="60" :formatter="colNoData" />
+            <vxe-column title="上报人" field="createByName" width="100" :formatter="colNoData" />
+            <vxe-column title="上报时间" field="createTime" min-width="100" :formatter="colNoData" />
+            <vxe-column title="状态" width="110">
+                <template #default="{ row }">
+                    <div :class="['c-res-' + row?.auditStatus]">{{ selectDictLabel(check_status, row?.auditStatus) }}</div>
+                </template>
+            </vxe-column>
+        </vxe-table>
+    </div>
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+</template>
+<script setup name="Pay-log" lang="ts">
+import { colNoData } from '@/utils/noData';
+import { listVipPayment } from '@/api/dgtmedicine/vipPayment/index';
+import { originPriceDetail } from '@/api/price/report';
+const { query }: any = useRoute()
+const router = useRouter();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { check_status } = toRefs<any>(proxy?.useDict('check_status'));
+// 字典
+const list = ref<any[]>([]);
+const loading = ref(true);
+const total = ref(0);
+const queryFormRef = ref<ElFormInstance>();
+const data = reactive<any>({
+    queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+    }
+});
+const { queryParams } = toRefs(data);
+/** 点击行上传发票 */
+
+/** 查询会员信息列表 */
+const getList = async () => {
+    loading.value = true;
+    const res = await originPriceDetail({ ...queryParams.value });
+    list.value = res.rows;
+    total.value = res.total;
+    loading.value = false;
+};
+/** 搜索按钮操作 */
+const handleQuery = (level?: any) => {
+    queryParams.value.pageNum = 1;
+    getList();
+};
+/** 重置按钮操作 */
+const resetQuery = () => {
+    queryFormRef.value?.resetFields();
+    handleQuery();
+};
+
+onMounted(() => {
+    getList();
+});
+</script>

+ 80 - 0
src/views/price/station/detail/index.vue

@@ -0,0 +1,80 @@
+<template>
+    <div class="p-3">
+        <div class="bg-fff flex1 ov-auto d-flex flex-cln">
+            <div class="d-flex a-c pd-16">
+                <div class="f-s-20 c-333 f-w-7 mr-10">监测点详情</div>
+                <el-button @click="router.go(-1)" type="primary" text>
+                    <el-icon>
+                        <Back />
+                    </el-icon>
+                    返回上一级
+                </el-button>
+            </div>
+            <div class="pd-16 border-bottom">
+                <div class="info-title f-w-5 mb-10">基本信息</div>
+                <el-descriptions :column="4">
+                    <el-descriptions-item label="企业名称:">{{ form?.cpyName || '-' }}</el-descriptions-item>
+                    <el-descriptions-item label="企业地址:">{{ form?.regionCodeName }}{{ form?.address || '-' }}</el-descriptions-item>
+                    <el-descriptions-item label="单位负责人:">{{ form?.contactPerson || '-' }}</el-descriptions-item>
+                    <el-descriptions-item label="负责人联系电话:">{{ form?.tel || '-' }}</el-descriptions-item>
+                    <el-descriptions-item label="有效期状态:">
+                        <el-tag v-if="+form?.isValid" type="success">有效</el-tag>
+                        <el-tag v-else type="danger">已过期</el-tag>
+                    </el-descriptions-item>
+                    <el-descriptions-item label="有效期至:">{{ form?.endDate || '-' }}</el-descriptions-item>
+                    <el-descriptions-item label="操作人:">{{ form?.createByName || '-' }}</el-descriptions-item>
+                    <el-descriptions-item label="操作时间:">{{ form?.createTime || '-' }}</el-descriptions-item>
+                </el-descriptions>
+            </div>
+            <div class="flex1 over-auto">
+                <div class="pd-16">
+                    <div class="info-title mb-16 f-w-5">上报产地价格信息</div>
+                    <priceRepordLog></priceRepordLog>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup name="Station-detail" lang="ts">
+import { originCpyInfo } from '@/api/price/station';
+import { priceRepordLog } from '../../models';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { query }:any = useRoute()
+const router = useRouter();
+const form = ref<any>(null);
+const getDetail = async () => {
+    proxy.$modal.loading('加载中...')
+    const res = await originCpyInfo(query?.id).finally(() => proxy.$modal.closeLoading());
+    if (!res || res.code !== 200) return;
+    form.value = res.data;
+};
+const tabs = ref([
+    { label: '订单信息', value: '1' },
+    { label: '套餐信息', value: '2' },
+])
+onMounted(() => {
+    getDetail()
+});
+</script>
+<style lang="scss" scoped>
+.tabs-item {
+    margin-right: 20px;
+   padding: 8px 20px;
+   font-size: 14px;
+   border-color:  #d7d7d7;
+   border-style: solid;
+   border-width: 1px 1px 0 1px;
+   cursor: pointer;
+   user-select: none;
+
+   &.checked {
+    color: #fff;
+    border-color: var(--el-color-primary);
+    background-color: var(--el-color-primary);
+   }
+}
+.border-botttom {
+    border-bottom: 1px solid #d7d7d7;
+}
+</style>

+ 65 - 8
src/views/price/station/index.vue

@@ -22,12 +22,13 @@
                 <div class="d-flex j-sb mb-16">
                 <div class="d-flex j-sb mb-16">
                     <div><searchTabs v-model="queryParams.isValid" @change="handleQuery" :list="tabs" key-label="name" key-value="type" key-count="num"></searchTabs></div>
                     <div><searchTabs v-model="queryParams.isValid" @change="handleQuery" :list="tabs" key-label="name" key-value="type" key-count="num"></searchTabs></div>
                     <div>
                     <div>
-                        <el-button type="primary">批量修改有效期</el-button>
-                        <el-button type="danger">批量删除</el-button>
+                        <el-button @click="batchUpdateEndDate" type="primary">批量修改有效期</el-button>
+                        <el-button @click="batchDelete" type="danger">批量删除</el-button>
                     </div>
                     </div>
                 </div>
                 </div>
                 <div class="flex1 ov-hd">
                 <div class="flex1 ov-hd">
-                    <vxe-table :loading="loading" border :data="list" min-height="0" max-height="100%">
+                    <vxe-table ref="tableRef" :loading="loading" border :data="list" min-height="0" max-height="auto" :column-config="{ resizable: true }" :row-config="{keyField: 'id',isCurrent: true, isHover: true}" :checkbox-config="{ highlight: true, range: true, trigger: 'row', reserve: true }">
+                        <vxe-column type="checkbox" width="60"></vxe-column>
                         <!-- 序号 -->
                         <!-- 序号 -->
                         <vxe-column type="seq" width="60" title="序号" align="center" />
                         <vxe-column type="seq" width="60" title="序号" align="center" />
                         <!-- 企业名称 -->
                         <!-- 企业名称 -->
@@ -49,8 +50,14 @@
                         <vxe-column title="有效期至" field="endDate" min-width="100" width="110" />
                         <vxe-column title="有效期至" field="endDate" min-width="100" width="110" />
                         <vxe-column title="操作人" field="createByName" min-width="100" :formatter="colNoData" />
                         <vxe-column title="操作人" field="createByName" min-width="100" :formatter="colNoData" />
                         <vxe-column title="操作时间" field="createTime" min-width="100" :formatter="colNoData" />
                         <vxe-column title="操作时间" field="createTime" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="操作" align="center" field="right" width="220">
-                            <template #default="{ row }"></template>
+                        <vxe-column title="操作" align="center" field="right" width="240">
+                            <template #default="{ row }">
+                                <el-button @click.stop="router.push({ path: 'station-detail', query: { id: row?.id } })" text type="primary">详情</el-button>
+                                <span></span>
+                                <el-button @click.stop="updateEndDateItem(row)" text style="color: #0079fe">修改有效期</el-button>
+                                <span></span>
+                                <el-button @click.stop="deleteItem(row)" text type="danger">删除</el-button>
+                            </template>
                         </vxe-column>
                         </vxe-column>
                     </vxe-table>
                     </vxe-table>
                 </div>
                 </div>
@@ -60,19 +67,22 @@
         </div>
         </div>
     </div>
     </div>
     <addStation v-model:show="showStation" @sueccess="handleQuery"></addStation>
     <addStation v-model:show="showStation" @sueccess="handleQuery"></addStation>
+    <EditStationEndDate v-if="showEndDate" v-model:show="showEndDate" :infos="infos" @sueccess="handleQuery"></EditStationEndDate>
 </template>
 </template>
 <script setup name="price-station" lang="ts">
 <script setup name="price-station" lang="ts">
-import { originCpyList, queryOriginCpyCount } from '@/api/price/station';
+import { deleteOriginCpy, originCpyList, queryOriginCpyCount } from '@/api/price/station';
 import { colNoData } from '@/utils/noData';
 import { colNoData } from '@/utils/noData';
 import { searchTabs } from '@/views/models';
 import { searchTabs } from '@/views/models';
-
 import NP from 'number-precision';
 import NP from 'number-precision';
-import { addStation } from '../models';
+import { addStation, EditStationEndDate } from '../models';
+const router = useRouter();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const queryParams = ref<any>({
 const queryParams = ref<any>({
     pageNum: 1,
     pageNum: 1,
     pageSize: 10,
     pageSize: 10,
     isValid: '1'
     isValid: '1'
 });
 });
+const showEndDate = ref(false);
 const showStation = ref(false);
 const showStation = ref(false);
 const loading = ref(false);
 const loading = ref(false);
 const total = ref(0);
 const total = ref(0);
@@ -101,6 +111,53 @@ const getTabs = async () => {
     if (!res || res.code !== 200) return;
     if (!res || res.code !== 200) return;
     tabs.value = res.data
     tabs.value = res.data
 };
 };
+const tableRef = ref<any>();
+// 批量删除
+const batchDelete = async () => {
+    const records = tableRef.value?.getCheckboxReserveRecords(true).concat(tableRef.value?.getCheckboxRecords());
+    if (!records.length) {
+        proxy?.$modal.msgWarning('请选择监测点');
+        return;
+    }
+    const confirm = await proxy?.$modal.confirm('是否确认删除监测点,删除后企业上报的数据将不再作为专业数据展示,之前上报的数据不受影响。');
+    const ids = records.map((item: any) => item.id);
+    if (confirm === 'confirm') {
+        deleteSubmit(ids)
+    }
+};
+const deleteItem = async (row: any) => {
+    const confirm = await proxy?.$modal.confirm('是否确认删除该监测点,删除后该企业上报的数据将不再作为专业数据展示,之前上报的数据不受影响。');
+    if (confirm === 'confirm') {
+        deleteSubmit([row.id])
+    }
+};
+// 删除提交
+const deleteSubmit = async (ids: string[]) => {
+    proxy?.$modal.loading('删除中...');
+    const res = await deleteOriginCpy(ids).finally(() => {
+        proxy?.$modal.closeLoading();
+    });
+    if (!res || res.code !== 200) return;
+    proxy?.$modal.msgSuccess('删除成功');
+    handleQuery();
+};
+// 修改有效期的检测点
+const infos = ref<any[]>([]);
+// 修改有效期
+const updateEndDateItem = async (row: any) => {
+    infos.value = [row];
+    showEndDate.value = true;
+};
+// 批量修改有效期
+const batchUpdateEndDate = async () => {
+    const records = tableRef.value?.getCheckboxReserveRecords(true).concat(tableRef.value?.getCheckboxRecords());
+    if (!records.length) {
+        proxy?.$modal.msgWarning('请选择监测点');
+        return;
+    }
+    infos.value = records;
+    showEndDate.value = true;
+};
 onMounted(() => {
 onMounted(() => {
     getTabs();
     getTabs();
     handleQuery();
     handleQuery();