This commit is contained in:
wangzenghua 2025-04-14 02:43:30 +01:00
commit f56bcdba16
19 changed files with 491 additions and 67 deletions

View File

@ -21,6 +21,7 @@
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.6.5",
"dayjs": "^1.11.13",
"echarts": "^5.6.0",
"element-plus": "^2.7.2",
"js-base64": "^3.7.6",

View File

@ -23,10 +23,10 @@ const inputSuppliesRoutes = [
meta: { title: '物资管理', icon: 'Document' },
children: [
{
path: '/sub-government-affairs-service/material/pesticide',
name: 'input-supplies-pesticide',
component: () => import('@/views/inputSuppliesManage/material/pesticide/index.vue'),
meta: { title: '农药管理', icon: 'Document' },
path: '/sub-government-affairs-service/material/seed',
name: 'input-supplies-seed',
component: () => import('@/views/inputSuppliesManage/material/seed/index.vue'),
meta: { title: '种源管理', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/material/fertilizer',
@ -34,18 +34,18 @@ const inputSuppliesRoutes = [
component: () => import('@/views/inputSuppliesManage/material/fertilizer/index.vue'),
meta: { title: '肥料管理', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/material/pesticide',
name: 'input-supplies-pesticide',
component: () => import('@/views/inputSuppliesManage/material/pesticide/index.vue'),
meta: { title: '农药管理', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/material/ratPoison',
name: 'input-supplies-ratPoison',
component: () => import('@/views/inputSuppliesManage/material/ratPoison/index.vue'),
meta: { title: '兽药管理', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/material/seed',
name: 'input-supplies-seed',
component: () => import('@/views/inputSuppliesManage/material/seed/index.vue'),
meta: { title: '种源管理', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/material/farmMachinery',
name: 'input-supplies-farmMachinery',
@ -90,12 +90,12 @@ const inputSuppliesRoutes = [
component: () => import('@/views/inputSuppliesManage/knowledgeManage/index.vue'),
meta: { title: '知识库', icon: 'Document' },
},
// {
// path: '/sub-government-affairs-service/patrolCaseManage',
// name: 'patrolCaseManage',
// component: () => import('@/views/inputSuppliesManage/patrolCaseManage/index.vue'),
// meta: { title: '巡查与案件管理', icon: 'Document' },
// },
{
path: '/sub-government-affairs-service/patrolCaseManage',
name: 'patrolCaseManage',
component: () => import('@/views/inputSuppliesManage/patrolCaseManage/index.vue'),
meta: { title: '巡查与案件管理', icon: 'Document' },
},
],
},
];

View File

@ -0,0 +1,66 @@
<template>
<el-dialog v-model="visible" title="Tips" width="500" draggable>
<avue-radio v-model="radio" :dic="radioDic" :button="true" class="top_radio"></avue-radio>
<br />
<avue-form v-model="data" :option="option"> </avue-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="visible = false">Cancel</el-button>
<el-button type="primary" @click="visible = false"> Confirm </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ref, defineExpose, reactive, onMounted } from 'vue';
import { customRules } from '@/config';
import dayjs from 'dayjs';
const data = ref({});
const visible = ref(false);
const radio = ref('1');
const radioDic = reactive([
{ label: '执法消息', value: '1' },
{ label: '被询问人信息', value: '2' },
{ label: '询问内容', value: '3' },
]);
const option = reactive({
column: [
{
label: '询问时间',
prop: 'time',
type: 'date',
format: 'YYYY-MM-DD HH:mm',
valueFormat: 'YYYY-MM-DD HH:mm',
span: 24,
disabled: true,
},
{ label: '询问地点', prop: 'address', span: 24 },
{ label: '询问机关', prop: 'unit', span: 24 },
{ label: '询问人', prop: 'person', span: 24 },
{ label: '记录人', prop: 'recordPerson', span: 24 },
],
});
function handleRecordOpen(obj = {}) {
visible.value = Object.keys(obj).length ? true : false;
if (visible.value) {
data.value = Object.assign({}, obj);
option.column[0].value = dayjs().format('YYYY-MM-DD HH:mm');
}
}
onMounted(() => {
console.log('dayjs', dayjs().format('YYYY-MM-DD HH-mm'));
option.column[0].value = dayjs().format('YYYY-MM-DD HH:mm');
});
defineExpose({
handleRecordOpen,
});
</script>
<style lang="scss" scoped>
.top_radio {
text-align: center;
}
</style>

View File

@ -1,19 +1,354 @@
<template>
<section class="custom-page">巡查与案件</section>
<section class="custom-page">
<avue-crud ref="crudRef" v-model:search="searchCondition" v-model:page="pageData" :data="data" :option="option">
<template #menu="scpoe">
<custom-table-operate :actions="actions" :data="scpoe" />
</template>
<template #sceneProof-form="{ row, type }">
<section class="proof_content_">
<span v-if="type == 'add'">照片视频</span>
<Attrs v-model:attrs="examineForm.proof" :type="type" :limit="5" :file-num="5" accept="image/*,video/*" />
</section>
</template>
<template #documentAttrs-form="{ row, type }">
<FileUpload v-model:attrs="examineForm.documentAttrs" :format="['rar', 'zip', 'doc', 'docx', 'pdf']" :type="type" />
</template>
<template #c2-form="{ type }">
<section class="record_content">
<FileUpload v-model:attrs="examineForm.documentAttrs" :type="type" />
<span>填写笔录</span>
</section>
</template>
</avue-crud>
<RecordModal ref="recordModalRef" />
</section>
</template>
<script setup>
import { ref } from 'vue';
import { ref, reactive, onMounted, watch } from 'vue';
import { getRegion as GetRegion } from '@/apis';
import { GetEntityList as GetUserList } from '@/apis/system/user';
import { GetEntityList as GetDict } from '@/apis/system/dict';
import { CRUD_OPTIONS, pageData, customRules } from '@/config';
import { useUserStore } from '@/store/modules/user';
import FileUpload from '@/views/landManage/component/illegalHandle/common/FileUpload.vue';
import Attrs from '@/views/inputSuppliesManage/common/Attrs.vue';
import RecordModal from './common/RecordModal.vue';
const UserStore = useUserStore();
const { VITE_APP_BASE_API } = import.meta.env;
onMounted(() => {
getRegion();
getMumber();
});
/* --------------- data --------------- */
// #region
const regionData = ref([]);
const memberData = ref([]);
const crudRef = ref(null);
const searchCondition = reactive({
keyword: '',
});
const data = ref([{}]);
const option = reactive({
...CRUD_OPTIONS,
selection: false,
dialogWidth: '50%',
column: [
{
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '任务编号',
prop: 'text1',
},
{
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '任务名称',
prop: 'text2',
},
{
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '单位名称',
prop: 'text3',
},
{
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '统一社会信用代码',
prop: 'text4',
},
{
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '法定代表人',
prop: 'text5',
},
{
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '联系电话',
prop: 'text6',
},
{
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '区域',
prop: 'text7',
},
],
group: [
{
label: '任务信息',
prop: 'taskInfo',
column: [
{
label: '任务名称',
prop: 'taskName',
},
{
label: '任务编号',
prop: 'taskNumber',
},
{
label: '任务巡查时限',
type: 'date',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
prop: 'taskTime',
},
{
label: '任务巡查类型',
prop: 'taskType',
type: 'select',
value: '1',
clearable: false,
dicData: [
{
label: '指定事项巡查',
value: '1',
},
{
label: '定期巡查',
value: '2',
},
{
label: '全面巡查',
value: '3',
},
],
},
{
label: '执法区域',
prop: 'region',
type: 'cascader',
dicData: [],
props: {
label: 'areaName',
value: 'areaCode',
children: 'areaChildVOS',
},
},
{
label: '小组成员',
prop: 'groupMember',
type: 'select',
dicData: [],
multiple: true,
props: {
label: 'nickName',
value: 'userId',
},
},
],
},
{
label: '执法对象',
prop: 'checkObject',
column: [
{
label: '单位名称',
prop: 'b1',
},
{
label: '社会统一信用代码',
prop: 'b2',
},
{
label: '法定代表人',
prop: 'b3',
},
{
label: '联系电话',
prop: 'phone',
},
{
label: '所在区域',
prop: 'region1',
type: 'cascader',
dicData: [],
props: {
label: 'areaName',
value: 'areaCode',
children: 'areaChildVOS',
},
},
{
label: '详细地址',
prop: 'addressDetail',
},
],
},
{
label: '登记核查信息',
prop: 'registerCheckInfo',
column: [
{
label: '案情记录',
prop: 'record',
span: 24,
type: 'textarea',
},
{
label: '现场取证',
prop: 'sceneProof',
span: 24,
},
{
label: '执法文书',
prop: 'c1',
},
{
label: '',
prop: 'documentAttrs',
span: 24,
},
{
label: '巡查笔录',
prop: 'c2',
},
],
},
{
label: '案件处理',
prop: '_caseResult',
column: [
{
label: '案件处理结果',
prop: 'caseResult',
span: 24,
type: 'radio',
dicUrl: `${VITE_APP_BASE_API}/system/dict/data/list`,
dicQuery: {
dictType: 'sys_law_case_result',
current: 1,
size: 9999,
},
dicHeaders: {
authorization: UserStore.token,
},
props: {
label: 'dictLabel',
value: 'dictValue',
},
dicFormatter: (res) => res?.data?.records ?? [],
},
],
},
],
});
const actions = reactive([
{
name: '详情',
icon: 'view',
event: ({ row }) => {},
},
{
name: '编辑',
icon: 'edit',
event: ({ row }) => {
crudRef.value.rowEdit(row);
},
},
{
name: '登记核查信息',
icon: 'clock',
event: ({ row }) => {
option.group[0].editDisplay = false;
option.group[1].column.forEach((v) => (v.editDisabled = true));
crudRef.value.rowEdit(row);
},
},
{
type: 'danger',
name: '删除',
icon: 'delete',
event: ({ row }) => {},
},
]);
const examineForm = reactive({
caseId: '',
proof: [],
documentAttrs: [],
});
watch(
() => examineForm,
() => {
console.log('examineForm', examineForm.attrs);
},
{
deep: true,
immediate: true,
}
);
const recordModalRef = ref(null);
// #endregion
/* --------------- methods --------------- */
// #region
async function getRegion() {
let res = await GetRegion();
if (res.code == 200) {
regionData.value = res?.data ?? [];
option.group[0].column[4].dicData = regionData.value;
option.group[1].column[4].dicData = regionData.value;
}
}
async function getMumber() {
let res = await GetUserList({
current: 1,
size: 99999,
deptId: 105,
});
if (res.code == 200) {
memberData.value = res?.data?.records ?? [];
option.group[0].column[5].dicData = memberData.value;
console.log('regionData.value', memberData.value);
}
}
async function getDictData(dicType) {
let res = await GetDict({
current: 1,
size: 99999,
dictType: dicType,
});
if (res.code == 200) {
option.group[0].column[3].dicData = res?.data?.records ?? [];
}
}
// #endregion
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.record_content {
display: flex;
}
</style>

View File

@ -2,7 +2,7 @@
<el-upload ref="upload" :file-list="fileList" class="upload-demo" :limit="props.limit" :auto-upload="false" :on-change="fileChange">
<el-button type="primary" :disabled="fileList.length == 5">点击上传</el-button>
<template #tip>
<div v-if="props.format.length" class="el-upload__tip">只能上传{{ props.format.join() }} 文件且不超过20MB</div>
<div v-if="props.format.length && props.tips" class="el-upload__tip">只能上传{{ props.format.join() }} 文件且不超过20MB</div>
</template>
<template #file="{ file }">
<section class="file_line">
@ -41,6 +41,10 @@ const props = defineProps({
type: String,
default: 'view',
},
tips: {
type: Boolean,
default: true,
},
});
/* --------------- data --------------- */

View File

@ -422,16 +422,7 @@ const examineForm = reactive({
proof: [],
attrs: [],
});
watch(
() => examineForm,
() => {
console.log('examineForm', examineForm.attrs);
},
{
deep: true,
immediate: true,
}
);
// #endregion
/* --------------- methods --------------- */

View File

@ -1,6 +1,6 @@
<template>
<div class="c-custom-img-warp">
<el-image :src="isMontage ? getAssetsFile(imgUrl) : imgUrl" :fit="fit" />
<el-image :src="isMontage ? (getAssetsFile(imgUrl)?.href ?? '') : imgUrl" :fit="fit" />
<div v-if="isViewVal" class="viewer-btn-warp">
<div class="viewer-btn" @click="toPreview">点击查看</div>
</div>
@ -53,6 +53,7 @@ watch(
imgUrl.value = props.url;
isViewVal.value = props.isView;
srcList = props.previewList;
console.log('getAssetsFile', getAssetsFile(imgUrl));
},
{
immediate: true,

View File

@ -16,7 +16,7 @@
<div class="layout-header-top-right">
<span>商家中心</span>
<span @click="toUserCenter">个人中心</span>
<span class="back-home" @click="toHome">
<span @click="toHome" class="back-home">
<div class="iconfont icon-home" style="font-size: 12px"></div>
<span>返回首页</span>
</span>
@ -118,7 +118,7 @@ const toUserCenter = () => {
.layout-header-warp {
width: 100%;
text-align: center;
background: #fff;
background: $color-fff;
.layout-header-menu {
width: 100%;
::v-deep() {

View File

@ -50,25 +50,25 @@ export const constantRoutes = [
component: Views,
redirect: '/sub-operation-service/ecommerce-agricultural',
name: 'agriculturalParent',
meta: { title: '农资交易' },
meta: { title: '农资交易', headerActive: 'ecommerce' },
children: [
{
path: '/sub-operation-service/ecommerce-agricultural',
component: () => import('@/views/ecommerce/index.vue'),
name: 'agricultural',
meta: { title: '农资交易' },
meta: { title: '农资交易', headerActive: 'ecommerce' },
},
{
path: '/sub-operation-service/ecommerce-agriculturalDetail',
component: () => import('@/views/ecommerce/agriculturalDetail.vue'),
name: 'agriculturalDetail',
meta: { title: '农资详情' },
meta: { title: '农资详情', headerActive: 'ecommerce' },
},
{
path: '/sub-operation-service/ecommerce-sourceCodeDetail',
component: () => import('@/views/ecommerce/sourceCodeDetail.vue'),
name: 'sourceCodeDetail',
meta: { title: '溯源详情' },
meta: { title: '溯源详情', headerActive: 'ecommerce' },
},
],
},
@ -77,19 +77,19 @@ export const constantRoutes = [
component: Views,
redirect: '/sub-operation-service/ecommerce-purchaser',
name: 'purchaserParent',
meta: { title: '采购商服务' },
meta: { title: '采购商服务', headerActive: 'ecommerce' },
children: [
{
path: '/sub-operation-service/ecommerce-purchaser',
component: () => import('@/views/ecommerce/purchaser.vue'),
name: 'purchaser',
meta: { title: '采购商服务' },
meta: { title: '采购商服务', headerActive: 'ecommerce' },
},
{
path: '/sub-operation-service/ecommerce-purchaserDetail',
component: () => import('@/views/ecommerce/purchaserDetail.vue'),
name: 'purchaserDetail',
meta: { title: '采购详情' },
meta: { title: '采购详情', headerActive: 'ecommerce' },
},
],
},
@ -98,31 +98,38 @@ export const constantRoutes = [
path: '/sub-operation-service/ecommerce-supplier',
component: () => import('@/views/ecommerce/supplier.vue'),
name: 'supplier',
meta: { title: '供应商服务' },
meta: { title: '供应商服务', headerActive: 'ecommerce' },
},
{
path: '/sub-operation-service/ecommerce-land',
component: Views,
redirect: '/sub-operation-service/ecommerce-land',
name: 'landParent',
meta: { title: '土地交易' },
meta: { title: '土地交易', headerActive: 'ecommerce' },
children: [
{
path: '/sub-operation-service/ecommerce-land',
component: () => import('@/views/ecommerce/land.vue'),
name: 'land',
meta: { title: '土地交易' },
meta: { title: '土地交易', headerActive: 'ecommerce' },
},
{
path: '/sub-operation-service/ecommerce-landDetail',
component: () => import('@/views/ecommerce/landDetail.vue'),
name: 'landDetail',
meta: { title: '土地详情' },
meta: { title: '土地详情', headerActive: 'ecommerce' },
},
],
},
],
},
{
path: '/sub-operation-service/farmingService',
name: 'farmingService',
component: Layout,
// component: () => import('@/views/farmingService/index.vue'),
meta: { title: '农事服务', headerActive: 'farmingService' },
},
{
path: '/sub-operation-service/userCenter',
name: 'userCentre',

View File

@ -143,7 +143,7 @@
<span>7</span>
</el-descriptions-item>
</el-descriptions>
<el-image :src="getAssetsFile('images/ecommerce/' + 'goods.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'goods.png')?.href ?? ''" fit="cover" />
</div>
<div v-if="tabVal == 'sourceCode'" class="content-source-code">
<div class="code-warp">

View File

@ -8,8 +8,8 @@
</div>
</template>
<script setup>
import { ref, reactive, onMounted, watch, computed } from 'vue';
import { isEmpty, getAssetsFile } from '@/utils';
import { ref, watch, computed } from 'vue';
import { getAssetsFile } from '@/utils';
import costomImg from '@/components/costomImg.vue';
const props = defineProps({
@ -36,14 +36,14 @@ const props = defineProps({
});
let nameVal = ref(props.name);
let list = reactive(props.imglist);
let list = ref([]);
let srcList = computed(() => {
let list = [];
list = props.imglist.map((m) => {
return getAssetsFile(m);
let _list = [];
_list = props.imglist.map((m) => {
return getAssetsFile(m)?.href ?? '';
});
return list;
return _list;
});
let isViewVal = ref(props.isView);
@ -52,7 +52,7 @@ watch(
() => (props.list, props.imglist, props.isView),
() => {
nameVal.value = props.name;
list = props.imglist;
list.value = props.imglist;
isViewVal.value = props.isView;
},
{

View File

@ -45,7 +45,7 @@
<div class="evaluate-item-top">
<div class="user-info">
<div class="info-img">
<el-image :src="getAssetsFile('images/ecommerce/' + 'goods.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'goods.png')?.href ?? ''" fit="cover" />
</div>
<div class="info-txt">
<div class="info-txt-pos">
@ -65,7 +65,7 @@
<div class="content-img">
<template v-for="(m, indexm) in 2" :key="indexm">
<div class="img-item">
<el-image :src="getAssetsFile('images/ecommerce/' + 'pic.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'pic.png')?.href ?? ''" fit="cover" />
</div>
</template>
</div>

View File

@ -1,7 +1,7 @@
<template>
<div class="c-goods-item-warp" @click="toDetail">
<div class="goods-img">
<el-image :src="getAssetsFile('images/ecommerce/' + 'pic.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'pic.png')?.href ?? ''" fit="cover" />
</div>
<div class="goods-name txt-ellipsis clamp2">{{ '遇合堂新款禽泰克家禽通用药250遇合堂新款禽泰克家禽通用药250' }}</div>
<div class="goods-do">

View File

@ -1,7 +1,7 @@
<template>
<div class="c-land-item-warp" @click="toDetail">
<div class="land-img">
<el-image :src="getAssetsFile('images/ecommerce/' + 'pic.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'pic.png')?.href ?? ''" fit="cover" />
</div>
<div class="land-info">
<div class="land-info-pos">

View File

@ -3,7 +3,7 @@
<div class="left-menu">
<view v-for="(n, index) in leftMenu" :key="index" class="left-menu-item" :class="currentIndex == index ? 'active' : ''" @click="toLink(index)">
<div class="item-img">
<img :src="getAssetsFile('images/ecommerce/' + n.icon)" />
<img :src="getAssetsFile('images/ecommerce/' + n.icon)?.href ?? ''" />
</div>
<span class="item-title">{{ n.title }}</span>
</view>

View File

@ -12,7 +12,7 @@
<el-col :span="16">
<div class="purchaser-info-l">
<div class="img">
<el-image :src="getAssetsFile('images/ecommerce/' + 'test01.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'test01.png')?.href ?? ''" fit="cover" />
</div>
<div class="content">
<div class="title-warp">

View File

@ -10,16 +10,16 @@
<div class="current-title">溯源详情</div>
</div>
<div class="top-img-txt">
<el-image :src="getAssetsFile('images/ecommerce/' + 'tracetxt.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'tracetxt.png')?.href ?? ''" fit="cover" />
</div>
<div class="top-bottom-warp">
<div v-for="(b, indexb) in bottomList" :key="indexb" class="top-bottom-item">
<div class="bottom-item-img">
<el-image :src="getAssetsFile('images/ecommerce/' + b.img)" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + b.img)?.href ?? ''" fit="cover" />
</div>
</div>
</div>
<el-image :src="getAssetsFile('images/ecommerce/' + 'traceb.png')" fit="cover" />
<el-image :src="getAssetsFile('images/ecommerce/' + 'traceb.png')?.href ?? ''" fit="cover" />
</div>
<div class="tab-content-warp">
<el-tabs v-model="activeCurrent" class="demo-tabs">
@ -164,7 +164,7 @@
<!-- <el-image :src="getAssetsFile('images/ecommerce/' + 'pic.png')" fit="none" /> -->
<costomImg
:url="'images/ecommerce/' + 'pic.png'"
:preview-list="[getAssetsFile('images/ecommerce/' + 'pic.png')]"
:preview-list="[getAssetsFile('images/ecommerce/' + 'pic.png')?.href ?? '']"
:is-view="true"
></costomImg>
<span class="img-tips">溯源证书</span>

View File

@ -0,0 +1,19 @@
<template>
<section>农事服务</section>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
/* --------------- data --------------- */
// #region
// #endregion
/* --------------- methods --------------- */
// #region
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -24,7 +24,7 @@
<div class="shop-img">
<costomImg
:url="'images/ecommerce/' + 'pic.png'"
:preview-list="[getAssetsFile('images/ecommerce/' + 'pic.png')]"
:preview-list="[getAssetsFile('images/ecommerce/' + 'pic.png')?.href ?? '']"
:is-view="false"
></costomImg>
</div>
@ -41,7 +41,7 @@
<div class="good-img" @click="toCheckGood(index, indexg)">
<costomImg
:url="'images/ecommerce/' + 'pic.png'"
:preview-list="[getAssetsFile('images/ecommerce/' + 'pic.png')]"
:preview-list="[getAssetsFile('images/ecommerce/' + 'pic.png')?.href ?? '']"
:is-view="false"
></costomImg>
</div>