zhangchong преди 1 година
родител
ревизия
e2009f1f27

+ 69 - 0
src/api/business/citizen.ts

@@ -0,0 +1,69 @@
+/*
+ * @Author: zc
+ * @description 业务管理-市民画像
+ */
+import request from '/@/utils/request';
+/**
+ * @description 市民画像列表
+ * @param {object} params
+ */
+export const citizenList = (params: object) => {
+    return request({
+        url: `/api/v1/Order/citizen/list`,
+        method: 'get',
+        params
+    });
+};
+/**
+ * @description 新增市民画像
+ * @param {object} data
+ */
+export const citizenAdd = (data: object) => {
+    return request({
+        url: `/api/v1/Order/citizen`,
+        method: 'post',
+        data
+    });
+};
+/**
+ * @description 修改市民画像
+ * @param {object} data
+ */
+export const citizenUpdate = (data: object) => {
+    return request({
+        url: `/api/v1/Order/citizen`,
+        method: 'put',
+        data
+    });
+};
+/**
+ * @description 删除市民画像
+ * @param {object} data
+ */
+export const citizenDelete = (data: object) => {
+    return request({
+        url: `/api/v1/Order/citizen`,
+        method: 'delete',
+        data
+    });
+};
+/**
+ * @description 获取市民信息详情
+ * @param {string} id
+ */
+export const citizenDetail = (id: string) => {
+    return request({
+        url: `/api/v1/Order/citizen/${id}`,
+        method: 'get'
+    });
+};
+/**
+ * @description 获取市民信息详情
+ * @param {string} phone
+ */
+export const citizenDetailByPhone = (phone: string) => {
+    return request({
+        url: `/api/v1/Order/citizen_phone/${phone}`,
+        method: 'get'
+    });
+};

+ 2 - 2
src/components/LogicFlow/index.vue

@@ -244,7 +244,7 @@ const initOp = () => {
 			text: '开始',
 			label: '开始节点',
 			properties: {
-
+        stepType: 1, // 节点类型(开始1 结束2)
       },
 			icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==',
 		},
@@ -263,7 +263,7 @@ const initOp = () => {
 			text: '结束',
 			label: '结束节点',
 			properties: {
-
+        stepType: 2, // 节点类型(开始1 结束2)
       },
 			icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAA1BJREFUOBFtVE1IVUEYPXOf+tq40Y3vPcmFIdSjIorWoRG0ERWUgnb5FwVhYQSl72oUoZAboxKNFtWiwKRN0M+jpfSzqJAQclHo001tKkjl3emc8V69igP3znzfnO/M9zcDcKT67azmjYWTwl9Vn7Vumeqzj1DVb6cleQY4oAVnIOPb+mKAGxQmKI5CWNJ2aLPatxWa3aB9K7/fB+/Z0jUF6TmMlFLQqrkECWQzOZxYGjTlOl8eeKaIY5yHnFn486xBustDjWT6dG7pmjHOJd+33t0iitTPkK6tEvjxq4h2MozQ6WFSX/LkDUGfFwfhEZj1Auz/U4pyAi5Sznd7uKzznXeVHlI/Aywmk6j7fsUsEuCGADrWARXXwjxWQsUbIupDHJI7kF5dRktg0eN81IbiZXiTESic50iwS+t1oJgL83jAiBupLDCQqwziaWSoAFSeIR3P5Xv5az00wyIn35QRYTwdSYbz8pH8fxUUAtxnFvYmEmgI0wYXUXcCCSpeEVpXlsRhBnCEATxWylL9+EKCAYhe1NGstUa6356kS9NVvt3DU2fd+Wtbm/+lSbylJqsqkSm9CRhvoJVlvKPvF1RKY/FcPn5j4UfIMLn8D4UYb54BNsilTDXKnF4CfTobA0FpoW/LSp306wkXM+XaOJhZaFkcNM82ASNAWMrhrUbRfmyeI1FvRBTpN06WKxa9BK0o2E4Pd3zfBBEwPsv9sQBnmLVbLEIZ/Xe9LYwJu/Er17W6HYVBc7vmuk0xUQ+pqxdom5Fnp55SiytXLPYoMXNM4u4SNSCFWnrVIzKG3EGyMXo6n/BQOe+bX3FClY4PwydVhthOZ9NnS+ntiLh0fxtlUJHAuGaFoVmttpVMeum0p3WEXbcll94l1wM/gZ0Ccczop77VvN2I7TlsZCsuXf1WHvWEhjO8DPtyOVg2/mvK9QqboEth+7pD6NUQC1HN/TwvydGBARi9MZSzLE4b8Ru3XhX2PBxf8E1er2A6516o0w4sIA+lwURhAON82Kwe2iDAC1Watq4XHaGQ7skLcFOtI5lDxuM2gZe6WFIotPAhbaeYlU4to5cuarF1QrcZ/lwrLaCJl66JBocYZnrNlvm2+MBCTmUymPrYZVbjdlr/BxlMjmNmNI3SAAAAAElFTkSuQmCC',
 		},

+ 0 - 2
src/components/ProcessApproval/index.vue

@@ -846,13 +846,11 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 			.then(() => {
 				state.loading = true;
 				let submitObj = other.deepClone(state.ruleForm);
-
 				if (submitObj.nextHandlers && submitObj.nextHandlers.length) {
 					if (submitObj.nextHandlers.length === 1) {
 						submitObj.nextMainHandler = submitObj.nextHandlers[0].key;
 					}
 				}
-
 				switch (state.processType) {
 					case '工单发起':
 						const request = {

+ 147 - 0
src/views/business/citizen/components/Lexicon-add.vue

@@ -0,0 +1,147 @@
+<template>
+	<el-dialog title="新增违禁词" v-model="state.dialogVisible" width="769px" draggable @close="close">
+		<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="违禁词" prop="name" :rules="[{ required: true, message: '请输入违禁词', trigger: 'blur' }]">
+						<el-input v-model="state.ruleForm.name" placeholder="请输入违禁词" clearable></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="违禁词分类" prop="classify" :rules="[{ required: true, message: '请选择违禁词分类', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.classify" placeholder="请选择违禁词分类" class="w100">
+							<el-option v-for="item in props.prohibitedClassify" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="违禁词属性" prop="type" :rules="[{ required: true, message: '请选择违禁词属性', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.type" placeholder="请选择违禁词属性" class="w100">
+							<el-option v-for="item in props.prohibitedType" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-form-item label="违禁同义词" prop="synonym" :rules="[{ required: false, message: '请选择违禁同义词', trigger: 'change' }]">
+						<el-tag v-for="tag in dynamicTags" :key="tag" class="mr10 mb10" size="large" closable :disable-transitions="false" @close="handleClose(tag)">
+							{{ tag }}
+						</el-tag>
+						<el-input
+							v-if="inputVisible"
+							ref="InputRef"
+							v-model="inputValue"
+							@keyup.enter="handleInputConfirm"
+							@blur="handleInputConfirm"
+							style="max-width: 200px"
+              class="mb10"
+						/>
+						<el-button v-else @click="showInput" class="mb10"> 添加同义词 </el-button>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts" name="qualityLexiconAdd">
+import { nextTick, reactive, ref } from 'vue';
+import { ElInput, ElMessage, FormInstance } from 'element-plus';
+import { lexiconAdd } from '/@/api/quality/lexicon';
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+const props = defineProps({
+	prohibitedClassify: {
+		type: Array,
+		default: () => [],
+	},
+	prohibitedType: {
+		type: Array,
+		default: () => [],
+	},
+});
+
+const inputValue = ref('');
+const dynamicTags = ref<EmptyArrayType>([]);
+const inputVisible = ref(false);
+const InputRef = ref<InstanceType<typeof ElInput>>();
+// 删除同义词
+const handleClose = (tag: string) => {
+	dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1);
+};
+// 展示输入框
+const showInput = () => {
+	inputVisible.value = true;
+	nextTick(() => {
+		InputRef.value!.input!.focus();
+	});
+};
+// 确定添加
+const handleInputConfirm = () => {
+	if (inputValue.value) {
+		dynamicTags.value.push(inputValue.value);
+	}
+	inputVisible.value = false;
+	inputValue.value = '';
+};
+
+// 定义变量内容
+const ruleFormRef = ref<FormInstance>();
+const state = reactive<any>({
+	dialogVisible: false, // 弹窗显示隐藏
+	ruleForm: {
+		name: '', // 违禁词
+		classify: '', // 违禁词分类
+		type: '', // 违禁词属性
+	},
+	loading: false, // 确定按钮loading
+});
+
+// 打开弹窗
+const openDialog = async () => {
+	state.dialogVisible = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	dynamicTags.value = [];
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 新增
+const onSubmit = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		const request = {
+			...state.ruleForm,
+			synonym: dynamicTags.value.join(','),
+		};
+		lexiconAdd(request)
+			.then(() => {
+				emit('updateList');
+				closeDialog(); // 关闭弹窗
+				ElMessage.success('操作成功');
+				state.loading = false;
+			})
+			.catch(() => {
+				emit('updateList');
+				state.loading = false;
+			});
+	});
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 154 - 0
src/views/business/citizen/components/Lexicon-edit.vue

@@ -0,0 +1,154 @@
+<template>
+	<el-dialog title="编辑违禁词" v-model="state.dialogVisible" width="769px" draggable @close="close">
+		<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="违禁词" prop="name" :rules="[{ required: true, message: '请输入违禁词', trigger: 'blur' }]">
+						<el-input v-model="state.ruleForm.name" placeholder="请输入违禁词" clearable></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="违禁词分类" prop="classify" :rules="[{ required: true, message: '请选择违禁词分类', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.classify" placeholder="请选择违禁词分类" class="w100">
+							<el-option v-for="item in props.prohibitedClassify" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="违禁词属性" prop="type" :rules="[{ required: true, message: '请选择违禁词属性', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.type" placeholder="请选择违禁词属性" class="w100">
+							<el-option v-for="item in props.prohibitedType" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-form-item label="违禁同义词" prop="synonym" :rules="[{ required: false, message: '请选择违禁同义词', trigger: 'change' }]">
+						<el-tag v-for="tag in dynamicTags" :key="tag" size="large" class="mr10 mb10" closable :disable-transitions="false" @close="handleClose(tag)">
+							{{ tag }}
+						</el-tag>
+						<el-input
+							v-if="inputVisible"
+							ref="InputRef"
+							v-model="inputValue"
+							@keyup.enter="handleInputConfirm"
+							@blur="handleInputConfirm"
+							style="max-width: 200px"
+              class="mb10"
+						/>
+						<el-button v-else @click="showInput" class="mb10"> 添加同义词 </el-button>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts" name="qualityLexiconEdit">
+import { nextTick, reactive, ref } from 'vue';
+import { ElInput, ElMessage, FormInstance } from 'element-plus';
+import { lexiconDetail, lexiconUpdate } from '/@/api/quality/lexicon';
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+const props = defineProps({
+	prohibitedClassify: {
+		type: Array,
+		default: () => [],
+	},
+	prohibitedType: {
+		type: Array,
+		default: () => [],
+	},
+});
+
+const inputValue = ref('');
+const dynamicTags = ref<EmptyArrayType>([]);
+const inputVisible = ref(false);
+const InputRef = ref<InstanceType<typeof ElInput>>();
+// 删除同义词
+const handleClose = (tag: string) => {
+	dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1);
+};
+// 展示输入框
+const showInput = () => {
+	inputVisible.value = true;
+	nextTick(() => {
+		InputRef.value!.input!.focus();
+	});
+};
+// 确定添加
+const handleInputConfirm = () => {
+	if (inputValue.value) {
+		dynamicTags.value.push(inputValue.value);
+	}
+	inputVisible.value = false;
+	inputValue.value = '';
+};
+
+// 定义变量内容
+const ruleFormRef = ref<FormInstance>();
+const state = reactive<any>({
+	dialogVisible: false, // 弹窗显示隐藏
+	ruleForm: {
+		name: '', // 违禁词
+		classify: '', // 违禁词分类
+		type: '', // 违禁词属性
+	},
+	loading: false, // 确定按钮loading
+});
+
+// 打开弹窗
+const openDialog = async (row: any) => {
+	try {
+		const res = await lexiconDetail(row.id);
+		state.ruleForm = res.result ?? {};
+		dynamicTags.value = res.result.synonym?.split(',') ?? [];
+		state.dialogVisible = true;
+	} catch (e) {
+		console.log(e);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	dynamicTags.value = [];
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 新增
+const onSubmit = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		const request = {
+			...state.ruleForm,
+			synonym: dynamicTags.value.join(','),
+		};
+		lexiconUpdate(request)
+			.then(() => {
+				emit('updateList');
+				closeDialog(); // 关闭弹窗
+				ElMessage.success('操作成功');
+				state.loading = false;
+			})
+			.catch(() => {
+				emit('updateList');
+				state.loading = false;
+			});
+	});
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 164 - 0
src/views/business/citizen/index.vue

@@ -0,0 +1,164 @@
+<template>
+  <div class="quality-lexicon-container layout-pd">
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
+        <el-form-item label="市民联系方式" prop="Name">
+          <el-input v-model="state.queryParams.Name" placeholder="请输入市民联系方式" clearable @keyup.enter="queryList" style="width: 250px" />
+        </el-form-item>
+        <el-form-item label="市民标签" prop="Name">
+          <el-input v-model="state.queryParams.Name" placeholder="请输入市民标签" clearable @keyup.enter="queryList" style="width: 250px" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+          <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <div class="mb20">
+        <el-button type="primary" @click="onLexiconAdd" v-waves v-auth="'business:citizen:add'">
+          <SvgIcon name="ele-Plus" class="mr5" />新增
+        </el-button>
+        <el-button type="primary" @click="onLexiconDelete" v-waves v-auth="'business:citizen:delete'" :disabled="!multipleSelection.length">
+          <SvgIcon name="ele-Delete" class="mr5" />删除
+        </el-button>
+      </div>
+      <!-- 表格 -->
+      <el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="name" label="市民联系方式" show-overflow-tooltip width="200"></el-table-column>
+        <el-table-column prop="classify" label="市民标签" show-overflow-tooltip width="200"></el-table-column>
+        <el-table-column prop="creatorName" label="创建人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="lastModificationName" label="更新人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="lastModificationTime" label="更新时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.lastModificationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="120" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button link type="primary" @click="onLexiconEdit(row)" v-auth="'business:citizen:tag'" title="查看市民标签记录"> 标签记录 </el-button>
+            <el-button link type="primary" @click="onLexiconEdit(row)" v-auth="'business:citizen:edit'" title="编辑市民画像"> 编辑 </el-button>
+          </template>
+        </el-table-column>
+        <template #empty>
+          <Empty />
+        </template>
+      </el-table>
+      <!-- 分页 -->
+      <pagination
+          :total="state.total"
+          v-model:page="state.queryParams.PageIndex"
+          v-model:limit="state.queryParams.PageSize"
+          @pagination="queryList"
+      />
+    </el-card>
+    <!--  违禁词新增  -->
+    <lexicon-add ref="lexiconAddRef" @updateList="queryList" :prohibitedClassify="prohibitedClassify" :prohibitedType="prohibitedType"/>
+    <!--  违禁词编辑  -->
+    <lexicon-edit ref="lexiconEditRef" @updateList="queryList" :prohibitedClassify="prohibitedClassify" :prohibitedType="prohibitedType"/>
+  </div>
+</template>
+
+<script lang="ts" setup name="businessCitizen">
+import { reactive, ref, onMounted, defineAsyncComponent } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '/@/utils/formatTime';
+import {auth} from "/@/utils/authFunction";
+import {citizenList,citizenDelete} from "/@/api/business/citizen"
+
+// 引入组件
+const LexiconAdd = defineAsyncComponent(() => import('/@/views/quality/lexicon/components/Lexicon-add.vue')); // 违禁词新增
+const LexiconEdit = defineAsyncComponent(() => import('/@/views/quality/lexicon/components/Lexicon-edit.vue')); // 违禁词编辑
+
+// 定义变量内容
+const state = reactive<any>({
+  loading: false, // 加载状态
+  queryParams: {
+    // 查询参数
+    PageIndex: 1,
+    PageSize: 10,
+    Classify: null,
+    Type: null,
+    Name:''
+  },
+  total: 0, // 总条数
+  tableData: [], // 表格数据
+});
+const ruleFormRef = ref<RefType>(null); // 表单ref
+const prohibitedClassify = ref<EmptyArrayType>([]); // 违禁词分类
+const prohibitedType = ref<EmptyArrayType>([]); // 违禁词属性
+// 获取参数列表
+const queryList = () => {
+  state.loading = true;
+  if (!auth('business:citizen:query')) ElMessage.error('抱歉,您没有权限获取市民画像列表!');
+  else {
+    citizenList(state.queryParams)
+        .then((res) => {
+          state.loading = false;
+          state.tableData = res.result.items ?? [];
+          state.total = res.result.total ?? 0;
+        })
+        .finally(() => {
+          state.loading = false;
+        });
+  }
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+  queryList();
+};
+// 新增意见
+const lexiconAddRef = ref<RefType>(); // 意见新增
+const onLexiconAdd = () => {
+  lexiconAddRef.value.openDialog();
+};
+// 修改意见
+const lexiconEditRef = ref<RefType>(); // 修改意见
+const onLexiconEdit = (row: any) => {
+  lexiconEditRef.value.openDialog(row);
+};
+// 表格多选
+const multipleTableRef = ref<RefType>();
+const multipleSelection = ref<any>([]);
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val;
+};
+// 删除参数
+const onLexiconDelete = () => {
+  const names = multipleSelection.value.map((item: any) => item.name).join('、');
+  const ids = multipleSelection.value.map((item: any) => item.id);
+  ElMessageBox.confirm(`您确定要删除:【${names}】市民画像,是否继续?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+    draggable: true,
+    cancelButtonClass: 'default-button',
+    autofocus: false,
+  })
+      .then(() => {
+        citizenDelete({ids}).then(() => {
+          ElMessage.success('操作成功');
+          queryList();
+        });
+      })
+      .catch(() => {});
+};
+// 页面加载时
+onMounted(() => {
+  queryList();
+});
+</script>
+
+<style lang="scss" scoped>
+.quality-lexicon-container {
+
+}
+</style>

+ 58 - 46
src/views/business/order/accept/Citizen-portrait.vue

@@ -48,9 +48,9 @@
 			<el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8" style="display: flex; align-items: center">
 				<el-card class="w100" shadow="never">
 					<p class="citizen-title mb10">市民画像</p>
-          <div class="citizen-img-box">
-            <img v-lazy="'https://cdn.pixabay.com/photo/2016/11/18/23/38/child-1837375_1280.png'" alt="">
-          </div>
+					<div class="citizen-img-box">
+						<img v-lazy="'https://cdn.pixabay.com/photo/2016/11/18/23/38/child-1837375_1280.png'" alt="" />
+					</div>
 				</el-card>
 			</el-col>
 			<el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
@@ -81,42 +81,54 @@
 			<el-col :span="24" class="mt20">
 				<el-card shadow="never">
 					<p class="border-title mb10">市民标签</p>
-          <div class="tag-list">
-            <el-tag v-for="tag in formData.tags" effect="dark" :key="tag">{{ tag }}</el-tag>
-          </div>
-          <div class="flex-center-align mt20">
-            <el-input v-model="input" placeholder="请输入标签内容" clearable show-word-limit maxlength="20" @keyup.enter="addTag"/>
-            <el-button type="primary" @click="addTag" class="ml10">添加标签</el-button>
-          </div>
+					<div class="tag-list">
+						<el-tag v-for="tag in formData.tags" effect="dark" :key="tag">{{ tag }}</el-tag>
+					</div>
+					<div class="flex-center-align mt20">
+						<el-input v-model="input" placeholder="请输入标签内容" clearable show-word-limit maxlength="20" @keyup.enter="addTag" />
+						<el-button type="primary" @click="addTag" class="ml10">添加标签</el-button>
+					</div>
 				</el-card>
 			</el-col>
 		</el-row>
 	</div>
 </template>
 <script setup lang="ts" name="orderAcceptCitizenPortrait">
-import {reactive, ref} from 'vue';
-import {ElMessage} from "element-plus";
+import {onMounted, reactive, ref, watch} from 'vue';
+import { ElMessage } from 'element-plus';
+import { citizenDetailByPhone } from '/@/api/business/citizen';
+
+const props = defineProps({
+  contact:{
+    type: String,
+    default: () => ''
+  }
+})
+watch(()=>props.contact,(newVal,oldVal)=>{
+  console.log(newVal,oldVal);
+  getDetail(newVal);
+})
 
 const formData = reactive({
 	phoneNo: '12345678901',
-	tags: [
-		'城市管理',
-		'工地噪音',
-		'市政供电',
-		'网络游戏违法信息',
-    '市政供电/临时电'
-	],
+	tags: ['城市管理', '工地噪音', '市政供电', '网络游戏违法信息', '市政供电/临时电'],
 });
 const input = ref('');
 const addTag = () => {
-  if(!input.value){
-    ElMessage.warning('请输入标签内容');
-    return;
-  }
-  if(input.value){
-    formData.tags.push(input.value);
-    input.value = '';
-  }
+	if (!input.value) {
+		ElMessage.warning('请输入标签内容');
+		return;
+	}
+	if (input.value) {
+		formData.tags.push(input.value);
+		input.value = '';
+	}
+};
+// 查询市民画像详情
+const getDetail = (phone:string) => {
+  citizenDetailByPhone(phone).then((res) => {
+    console.log(res);
+  });
 };
 </script>
 
@@ -140,25 +152,25 @@ const addTag = () => {
 				}
 			}
 		}
-    .citizen-title{
-      font-size: 16px;
-      font-weight: bold;
-      text-align: center;
-    }
-    .citizen-img-box{
-      img{
-        width: 100%;
-      }
-    }
-    .tag-list{
-      margin-top: 20px;
-      .el-tag{
-        margin:0 10px 10px 0;
-        &:last-child{
-          margin:0 0 10px 0;
-        }
-      }
-    }
+		.citizen-title {
+			font-size: 16px;
+			font-weight: bold;
+			text-align: center;
+		}
+		.citizen-img-box {
+			img {
+				width: 100%;
+			}
+		}
+		.tag-list {
+			margin-top: 20px;
+			.el-tag {
+				margin: 0 10px 10px 0;
+				&:last-child {
+					margin: 0 0 10px 0;
+				}
+			}
+		}
 	}
 }
 </style>

+ 1 - 1
src/views/business/order/accept/index.vue

@@ -479,7 +479,7 @@
                 <voice-assistant />
               </el-tab-pane>
 							<el-tab-pane label="市民画像" name="draw">
-                <citizen-portrait />
+                <citizen-portrait :contact="state.ruleForm.contact"/>
               </el-tab-pane>
 						</el-tabs>
 					</el-card>

+ 3 - 2
src/views/system/config/workflow/component/workflowEdit.vue

@@ -23,7 +23,7 @@ let flowData = ref({
 			x: 780,
 			y: 120,
 			properties: {
-
+        stepType: 1, // 节点类型(开始1 结束2)
       },
 			text: {
 				x: 780,
@@ -37,7 +37,8 @@ let flowData = ref({
 			x: 780,
 			y: 400,
 			properties: <EmptyObjectType>{
-
+          // 附加属性
+        stepType: 2, // 节点类型(开始1 结束2)
       },
 			text: {
 				x: 780,