zhangchong 2 anni fa
parent
commit
56f9f1f1fa
34 ha cambiato i file con 2676 aggiunte e 837 eliminazioni
  1. 50 4
      src/api/knowledge/apply.ts
  2. 4 4
      src/api/knowledge/draft.ts
  3. 96 12
      src/api/knowledge/index.ts
  4. 24 23
      src/layout/navMenu/subThreeItem.vue
  5. 20 6
      src/views/business/order/accept/add.vue
  6. 22 8
      src/views/business/order/accept/edit.vue
  7. 22 8
      src/views/business/order/components/Comment.vue
  8. 2 2
      src/views/business/order/components/ExpandForm.vue
  9. 8 3
      src/views/business/order/components/Process.vue
  10. 253 266
      src/views/business/order/index.vue
  11. 117 0
      src/views/knowledge/apply/component/Detail.vue
  12. 187 0
      src/views/knowledge/apply/component/Handle.vue
  13. 102 59
      src/views/knowledge/apply/index.vue
  14. 49 28
      src/views/knowledge/apply/my/component/Add.vue
  15. 117 0
      src/views/knowledge/apply/my/component/Detail.vue
  16. 49 28
      src/views/knowledge/apply/my/component/edit.vue
  17. 126 60
      src/views/knowledge/apply/my/index.vue
  18. 68 0
      src/views/knowledge/component/Preview.vue
  19. 495 0
      src/views/knowledge/component/Process.vue
  20. 58 0
      src/views/knowledge/component/ProcessRecord.vue
  21. 5 4
      src/views/knowledge/config/standard/index.vue
  22. 9 6
      src/views/knowledge/config/type/index.vue
  23. 2 2
      src/views/knowledge/knowledge/component/StandardInfo.vue
  24. 128 84
      src/views/knowledge/knowledge/component/add.vue
  25. 304 52
      src/views/knowledge/knowledge/component/edit.vue
  26. 43 22
      src/views/knowledge/knowledge/delApply/index.vue
  27. 78 27
      src/views/knowledge/knowledge/draft/index.vue
  28. 148 60
      src/views/knowledge/knowledge/index.vue
  29. 74 44
      src/views/knowledge/process/index.vue
  30. 10 1
      src/views/system/organize/index.vue
  31. 3 18
      src/views/system/user/index.vue
  32. 1 2
      src/views/tels/blacklist/component/addBlacklist.vue
  33. 1 2
      src/views/tels/blacklist/index.vue
  34. 1 2
      src/views/tels/telsLog/index.vue

+ 50 - 4
src/api/knowledge/apply.ts

@@ -9,7 +9,7 @@
 import request from '/@/utils/request';
 /**
  * @description: 知识检索
- * @param 
+ * @param {object} params
  * @return {*}
  */
 export const KnowledgeApply = (params:object) => {
@@ -21,7 +21,7 @@ export const KnowledgeApply = (params:object) => {
 };
 /**
  * @description: 发起申请
- * @param 
+ * @param {object} data
  * @return {*}
  */
 export const KnowledgeApplyAdd = (data:object) => {
@@ -33,7 +33,7 @@ export const KnowledgeApplyAdd = (data:object) => {
 };
 /**
  * @description: 修改申请
- * @param 
+ * @param {object} data
  * @return {*}
  */
 export const KnowledgeApplyUpdate = (data:object) => {
@@ -45,7 +45,7 @@ export const KnowledgeApplyUpdate = (data:object) => {
 };
 /**
  * @description: 查询申请详情
- * @param 
+ * @param {string} Id
  * @return {*}
  */
 export const KnowledgeApplyDetail = (Id:string) => {
@@ -53,4 +53,50 @@ export const KnowledgeApplyDetail = (Id:string) => {
 		url: `/api/v1/KnowledgeApply/info/${Id}`,
 		method: 'get',
 	});
+};
+/**
+ * @description: 知识申请-信息办理
+ * @param {object} data
+ * @return {*}
+ */
+export const KnowledgeHandle = (data:object) => {
+	return request({
+		url: `/api/v1/KnowledgeApply/handle`,
+		method: 'put',
+		data
+	});
+};
+/**
+ * @description: 我的知识申请- 撤销操作 撤销申请
+ * @param {string} Id
+ * @return {*}
+ */
+export const KnowledgeCancel= (Id:string) => {
+	return request({
+		url: `/api/v1/KnowledgeApply/apply-handle/${Id}`,
+		method: 'put'
+	});
+};
+/**
+ * @description: 知识申请- 退回操作
+ * @param {object} Id
+ * @return {*}
+ */
+export const KnowledgeReturn= (data:object) => {
+	return request({
+		url: `/api/v1/KnowledgeApply/return`,
+		method: 'put',
+		data
+	});
+};
+/**
+ * @description: 删除申请
+ * @param {string} Id
+ * @return {*}
+ */
+export const KnowledgeRemove= (id:string) => {
+	return request({
+		url: `/api/v1/KnowledgeApply/remove?Id=${id}`,
+		method: 'Delete'
+	});
 };

+ 4 - 4
src/api/knowledge/draft.ts

@@ -48,18 +48,18 @@ export const updatedrafts = (data: object) => {
   @param {string} id
  * @return {*}
  */
-  export const draftsinfo = (id: string) => {
+  export const draftsinfo = (id: string | string[]) => {
 	return request({
-		url: `api/v1/Knowledge/draftsinfo?Id=${id}`,
+		url: `api/v1/Knowledge/draftsinfo/${id}`,
 		method: 'get'
 	});
 };
 /**
- * @description: 草稿箱-查询详情
+ * @description: 草稿箱-删除
   @param {string} id
  * @return {*}
  */
-  export const removedrafts = (id: string) => {
+  export const removedrafts = (id: string | string[]) => {
 	return request({
 		url: `/api/v1/Knowledge/removedrafts?Id=${id}`,
 		method: 'delete'

+ 96 - 12
src/api/knowledge/index.ts

@@ -72,7 +72,7 @@ export const KnowledgeUpdate = (data: object) => {
  * @param {string} id
  * @return {*}
  */
-export const KnowledgeDel = (data: object,id:string) => {
+export const KnowledgeDel = (data: object, id: string) => {
 	return request({
 		url: `/api/v1/Knowledge/remove?Id=${id}`,
 		method: 'post',
@@ -84,7 +84,7 @@ export const KnowledgeDel = (data: object,id:string) => {
  * @param {string} Id
  * @return {*}
  */
-export const KnowledgeDetail = (Id: string) => {
+export const KnowledgeDetail = (Id: string | string[]) => {
 	return request({
 		url: `/api/v1/Knowledge/updateinfo/${Id}`,
 		method: 'get',
@@ -95,29 +95,29 @@ export const KnowledgeDetail = (Id: string) => {
  * @param {string} Id
  * @return {*}
  */
-export const KnowledgeInfo = (Id: string) => {
+export const KnowledgeInfo = (Id: string | string[]) => {
 	return request({
 		url: `/api/v1/Knowledge/info/${Id}`,
 		method: 'get',
 	});
 };
 /**
- * @description: 知识库
+ * @description: 知识库
  * @param {string} Id
  * @return {*}
  */
-export const KnowledgeOffshelf= (Id: string) => {
+export const KnowledgeOffshelf = (Id: string) => {
 	return request({
 		url: `/api/v1/Knowledge/offshelf?Id=${Id}`,
 		method: 'put',
 	});
 };
 /**
- * @description: 知识库
+ * @description: 知识库
  * @param {string} Id
  * @return {*}
  */
-export const KnowledgeOntheshelf= (Id: string) => {
+export const KnowledgeOntheshelf = (Id: string) => {
 	return request({
 		url: `/api/v1/Knowledge/ontheshelf?Id=${Id}`,
 		method: 'put',
@@ -128,7 +128,7 @@ export const KnowledgeOntheshelf= (Id: string) => {
  * @param {string} workFlowId
  * @return {*}
  */
-export const KnowledgeRevoke= (workFlowId: string) => {
+export const KnowledgeRevoke = (workFlowId: string) => {
 	return request({
 		url: `/api/v1/Knowledge/revoke?workFlowId=${workFlowId}`,
 		method: 'put',
@@ -139,7 +139,7 @@ export const KnowledgeRevoke= (workFlowId: string) => {
  * @param {string} workFlowId
  * @return {*}
  */
-export const KnowledgeGetworkflow= (workFlowId: string) => {
+export const KnowledgeGetworkflow = (workFlowId: string) => {
 	return request({
 		url: `/api/v1/Knowledge/getworkflow?workFlowId=${workFlowId}`,
 		method: 'get',
@@ -150,7 +150,7 @@ export const KnowledgeGetworkflow= (workFlowId: string) => {
  * @param {object} params
  * @return {*}
  */
-export const KnowledgeGetknowledge= (params: object) => {
+export const KnowledgeGetknowledge = (params: object) => {
 	return request({
 		url: `/api/v1/Knowledge/getknowledge`,
 		method: 'get',
@@ -162,7 +162,7 @@ export const KnowledgeGetknowledge= (params: object) => {
  * @param {object} params
  * @return {*}
  */
-export const KnowledgeDeletelist= (params: object) => {
+export const KnowledgeDeletelist = (params: object) => {
 	return request({
 		url: `/api/v1/Knowledge/deletelist`,
 		method: 'get',
@@ -174,10 +174,94 @@ export const KnowledgeDeletelist= (params: object) => {
  * @param {object} params
  * @return {*}
  */
-export const KnowledgeApprovedlist= (params: object) => {
+export const KnowledgeApprovedlist = (params: object) => {
 	return request({
 		url: `/api/v1/Knowledge/approvedlist`,
 		method: 'get',
 		params
 	});
+};
+/**
+ * @description:  查询-新增知识申请
+ * @param {object} params
+ * @return {*}
+ */
+export const KnowledgeAddapply = (params: object) => {
+	return request({
+		url: `/api/v1/KnowledgeApply/addapply`,
+		method: 'get',
+		params
+	});
+};
+/**
+ * @description:  新增-开始流程
+ * @param {string} id
+ * @param {object} data
+ * @return {*}
+ */
+export const KnowledgeAddStartflow = (id: object, data: object) => {
+	return request({
+		url: `/api/v1/Knowledge/${id}/add-startflow`,
+		method: 'post',
+		data
+	});
+};
+/**
+ * @description:  修改-开始流程
+  * @param {string} id
+ * @param {object} data
+ * @return {*}
+ */
+export const KnowledgeUpdateStartflow = (id: object, data: object) => {
+	return request({
+		url: `/api/v1/Knowledge/${id}/update-startflow`,
+		method: 'post',
+		data
+	});
+};
+/**
+ * @description:  删除-开始流程
+ * @param {string} id
+ * @param {object} data
+ * @return {*}
+ */
+export const KnowledgeDeleteStartflow = (id: object, data: object) => {
+	return request({
+		url: `/api/v1/Knowledge/${id}/remove-startflow`,
+		method: 'post',
+		data
+	});
+};
+/**
+ * @description:  查询知识库办理流程开启参数-新增
+ * @param {object} params
+ * @return {*}
+ */
+export const KnowledgeAddStartflowParams = () => {
+	return request({
+		url: `/api/v1/Knowledge/add-flow-start`,
+		method: 'get'
+	});
+};
+/**
+ * @description:  查询知识库办理流程开启参数-修改
+ * @param {object} params
+ * @return {*}
+ */
+export const KnowledgeUpdateStartflowParams = () => {
+	return request({
+		url: `/api/v1/Knowledge/update-flow-start`,
+		method: 'get'
+	});
+};
+/**
+ * @description:  查询知识库办理流程开启参数-删除
+ * @param {object} params
+ * @return {*}
+ */
+export const KnowledgeDeleteStartflowParams = () => {
+	return request({
+		url: `/api/v1/Knowledge/remove-flow-start`,
+		method: 'get'
+	});
 };

+ 24 - 23
src/layout/navMenu/subThreeItem.vue

@@ -18,7 +18,7 @@
 				<template v-if="!val.meta.isLink || (val.meta.isLink && val.meta.isIframe)">
 					<div @click="pushRouter(val)" class="path-inner">
 						<SvgIcon :name="val.meta.icon" v-if="val.meta?.icon" class="icons" />
-						<span>{{ val.meta.title }}</span>
+						<span :title="val.meta.title">{{ val.meta.title }}</span>
 					</div>
 				</template>
 				<template v-else>
@@ -70,23 +70,22 @@ const pushRouter = (val: any) => {
 };
 // 打开外部链接
 const onALinkClick = (val: any) => {
-	console.log(val);
 	const { origin, pathname } = window.location;
 	router.push(val.path);
 	if (verifyUrl(val.meta.isLink)) window.open(val.meta.isLink);
 	else window.open(`${origin}${pathname}#${val.meta.isLink}`);
 };
 watch(
-	() => props.chil,
+	() => chils,
 	(val) => {
-		if (val.length === 1) {
+		if (val.value.length === 1) {
 			popWidtn.value = 640 * 0.25;
-		} else if (val.length === 2) {
+		} else if (val.value.length === 2) {
 			popWidtn.value = 640 * 0.5;
-		} else if (val.length === 3) {
-			popWidtn.value = 640 * 0.75;
-		} else if (val.length >= 4) {
-			popWidtn.value = 640;
+		} else if (val.value.length === 3) {
+			popWidtn.value = 640 * 0.75 + 2;
+		} else if (val.value.length >= 4) {
+			popWidtn.value = 645;
 		}
 	},
 	{ immediate: true }
@@ -146,30 +145,29 @@ watch(
 .warp {
 	flex-wrap: wrap;
 }
-
 .pathBox {
 	display: flex;
-	width: 100%;
 	.path {
 		border-right: 1px solid var(--el-border-color);
+		width: 150px;
 		.icons {
 			font-size: 14px !important;
 			display: inline-block;
 			vertical-align: middle;
 			margin-right: 5px;
+			width: 24px;
 			text-align: center;
-			justify-content: center;
 		}
 		&-inner {
-			width: 150px;
 			cursor: pointer;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-			overflow: hidden;
 			display: flex;
 			align-items: center;
 			justify-content: center;
-			padding: 15px;
+			white-space: nowrap;
+			height: 56px !important;
+			line-height: 56px !important;
+			box-sizing: border-box;
+			transition: border-color var(--el-transition-duration), background-color var(--el-transition-duration), color var(--el-transition-duration);
 			&:hover {
 				background-color: var(--hotline-bg-main-color) !important;
 			}
@@ -177,13 +175,16 @@ watch(
 		&:nth-child(4n) {
 			border: none;
 		}
-
 		&:last-child {
 			border: none;
 		}
-
 		span {
-			margin-left: 3px;
+			display: inline-block;
+			max-width: 100px;
+			white-space: nowrap;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			vertical-align: bottom;
 		}
 
 		&.active {
@@ -192,8 +193,8 @@ watch(
 	}
 }
 </style>
-<!-- <style lang="scss">
+<style lang="scss">
 .menuItem-popover{
-	
+	padding: 10px 20px !important;
 }
-</style> -->
+</style>

+ 20 - 6
src/views/business/order/accept/add.vue

@@ -266,7 +266,7 @@
 							</el-col>
 							<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 								<el-form-item label="事发时间" prop="incidentTime" :rules="[{ required: false, message: '请选择事发时间', trigger: 'change' }]">
-									<el-date-picker v-model="state.ruleForm.incidentTime" type="date" placeholder="请选择事发时间" format="YYYY-MM-DD" class="w100" />
+									<el-date-picker v-model="state.ruleForm.incidentTime" type="date" placeholder="请选择事发时间" value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]" class="w100" />
 									<!-- value-format="YYYY-MM-DD" -->
 								</el-form-item>
 							</el-col>
@@ -417,19 +417,19 @@
 								<el-button type="primary" @click="handleQuery" :loading="state.historyOrderLoading" v-waves>
 									<SvgIcon name="ele-Search" class="mr5" />查询
 								</el-button>
-								<el-button @click="resetQuery(queryParamsRef)" v-waves class="default-button">
+								<el-button @click="resetQuery(queryParamsRef)" :loading="state.historyOrderLoading" v-waves class="default-button">
 									<SvgIcon name="ele-Refresh" class="mr5" />重置
 								</el-button>
 							</el-form-item>
 						</el-form>
-						<el-table :data="state.tableData" v-loading="state.historyOrderLoading" @current-change="handleSelectionChange">
+						<el-table :data="state.tableData" v-loading="state.historyOrderLoading" @current-change="handleSelectionChange" max-height="300">
 							<el-table-column prop="phoneNo" label="重复件" width="70" v-if="state.ruleForm.isRepeat === 'true'">
 								<template #default="scope">
 									<el-radio v-model="state.tableRadio" :label="scope.row.id" @change="handleRowChange(scope.row)">&nbsp;</el-radio>
 								</template>
 							</el-table-column>
 							<el-table-column type="index" width="60" label="序号" />
-							<el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip>
+							<el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip width="180">
 								<template #default="scope">
 									<span style="color: var(--el-color-primary)">{{ scope.row.title }}</span>
 								</template>
@@ -439,12 +439,25 @@
 							<el-table-column prop="currentStepName" label="当前环节" show-overflow-tooltip></el-table-column>
 							<el-table-column prop="statusText" label="状态" width="70" fixed="right" align="center">
 								<template #default="scope">
-									<span style="color: var(--el-color-primary)">{{ scope.row.statusText }}</span>
+									<!-- 草稿 -->
+									<span style="color: var(--el-color-info)" v-if="scope.row.status === 0">{{ scope.row.statusText }}</span>
+									<!-- 待签收 -->
+									<span style="color: var(--el-color-success)" v-if="scope.row.status === 10">{{ scope.row.statusText }}</span>
+									<!-- 办理中 -->
+									<span style="color: var(--el-color-primary)" v-if="scope.row.status === 20">{{ scope.row.statusText }}</span>
+									<!-- 会签中 -->
+									<span style="color: var(--el-color-primary)" v-if="scope.row.status === 30">{{ scope.row.statusText }}</span>
+									<!-- 退回 -->
+									<span style="color: var(--el-color-danger)" v-if="scope.row.status === 40">{{ scope.row.statusText }}</span>
+									<!-- 办理完成 -->
+									<span style="color: var(--el-color-success)" v-if="scope.row.status === 50">{{ scope.row.statusText }}</span>
+									<!-- 已归档 -->
+									<span style="color: var(--el-color-info)" v-if="scope.row.status === 60">{{ scope.row.statusText }}</span>
 								</template>
 							</el-table-column>
 							<el-table-column prop="statusText" label="操作" width="70" fixed="right" align="center">
 								<template #default="scope">
-									<span style="color: var(--el-color-primary)" @click="onSupply(scope.row)">补充</span>
+									<el-button @click="onSupply(scope.row)" link type="primary"> 补充 </el-button>
 								</template>
 							</el-table-column>
 						</el-table>
@@ -568,6 +581,7 @@ const state = reactive<any>({
 		employeeStaffNo: '',
 		duplicateTitle: '',
 		duplicateId: '',
+		content:'',
 	},
 	formLoading: false, // 表单加载状态
 	historyOrderLoading: false, // 历史工单加载状态

+ 22 - 8
src/views/business/order/accept/edit.vue

@@ -274,7 +274,7 @@
 							</el-col>
 							<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 								<el-form-item label="事发时间" prop="incidentTime" :rules="[{ required: false, message: '请选择事发时间', trigger: 'change' }]">
-									<el-date-picker v-model="state.ruleForm.incidentTime" type="date" placeholder="请选择事发时间" format="YYYY-MM-DD" class="w100" />
+									<el-date-picker v-model="state.ruleForm.incidentTime" type="date" placeholder="请选择事发时间" value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]" class="w100" />
 									<!-- value-format="YYYY-MM-DD" -->
 								</el-form-item>
 							</el-col>
@@ -425,19 +425,19 @@
 								<el-button type="primary" @click="handleQuery" :loading="state.historyOrderLoading" v-waves>
 									<SvgIcon name="ele-Search" class="mr5" />查询
 								</el-button>
-								<el-button @click="resetQuery(queryParamsRef)" v-waves class="default-button">
+								<el-button @click="resetQuery(queryParamsRef)" :loading="state.historyOrderLoading" v-waves class="default-button">
 									<SvgIcon name="ele-Refresh" class="mr5" />重置
 								</el-button>
 							</el-form-item>
 						</el-form>
-						<el-table :data="state.tableData" v-loading="state.historyOrderLoading" @current-change="handleSelectionChange">
+						<el-table :data="state.tableData" v-loading="state.historyOrderLoading" @current-change="handleSelectionChange" max-height="300">
 							<el-table-column prop="phoneNo" label="重复件" width="70" v-if="state.ruleForm.isRepeat === 'true'">
 								<template #default="scope">
 									<el-radio v-model="state.tableRadio" :label="scope.row.id" @change="handleRowChange(scope.row)">&nbsp;</el-radio>
 								</template>
 							</el-table-column>
 							<el-table-column type="index" width="60" label="序号" />
-							<el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip>
+							<el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip width="180">
 								<template #default="scope">
 									<span style="color: var(--el-color-primary)">{{ scope.row.title }}</span>
 								</template>
@@ -447,8 +447,21 @@
 							<el-table-column prop="currentStepName" label="当前环节" show-overflow-tooltip></el-table-column>
 							<el-table-column prop="statusText" label="状态" width="70" fixed="right" align="center">
 								<template #default="scope">
-									<span style="color: var(--el-color-primary)">{{ scope.row.statusText }}</span>
-								</template>
+								<!-- 草稿 -->
+								<span style="color: var(--el-color-info)" v-if="scope.row.status === 0">{{ scope.row.statusText }}</span>
+								<!-- 待签收 -->
+								<span style="color: var(--el-color-success)" v-if="scope.row.status === 10">{{ scope.row.statusText }}</span>
+								<!-- 办理中 -->
+								<span style="color: var(--el-color-primary)" v-if="scope.row.status === 20">{{ scope.row.statusText }}</span>
+								<!-- 会签中 -->
+								<span style="color: var(--el-color-primary)" v-if="scope.row.status === 30">{{ scope.row.statusText }}</span>
+								<!-- 退回 -->
+								<span style="color: var(--el-color-danger)" v-if="scope.row.status === 40">{{ scope.row.statusText }}</span>
+								<!-- 办理完成 -->
+								<span style="color: var(--el-color-success)" v-if="scope.row.status === 50">{{ scope.row.statusText }}</span>
+								<!-- 已归档 -->
+								<span style="color: var(--el-color-info)" v-if="scope.row.status === 60">{{ scope.row.statusText }}</span>
+							</template>
 							</el-table-column>
 							<el-table-column prop="statusText" label="操作" width="70" fixed="right" align="center">
 								<template #default="scope">
@@ -575,6 +588,7 @@ const state = reactive<any>({
 		employeeStaffNo: '',
 		duplicateTitle: '',
 		duplicateId: '',
+		content:''
 	},
 	formLoading: false, // 表单加载状态
 	historyOrderLoading: false, // 历史工单加载状态
@@ -994,14 +1008,14 @@ onMounted(async () => {
 						}
 					});
 				}
-				if (state.ruleForm.duplicateId) {
+				if (response.result.duplicateId) {
 					// 是否重复
 					state.ruleForm.isRepeat = 'true';
 					state.tableRadio = state.ruleForm.duplicateId;
 				} else {
 					state.ruleForm.isRepeat = 'false';
 				}
-				if (state.ruleForm.hotspotExternal) {
+				if (response.result.hotspotExternal) {
 					//热点分类默认展开
 					state.hotspotExternal = state.ruleForm.hotspotExternal.split(',');
 				}

+ 22 - 8
src/views/business/order/components/Comment.vue

@@ -103,16 +103,23 @@ const state = reactive<any>({
 const commentsFormRef = ref();
 // 打开弹窗
 const openDialog = async (val: any) => {
-	state.loading = true;
 	state.typecode = val;
 	state.active = 'default';
 	commentsFormRef.value?.resetFields();
 	state.manage = false;
-	const res: any = await commonList({ typecode: val });
-	state.commentsList = res.result;
-	state.loading = false;
+	getList(val);
 	state.showDrawer = true;
 };
+const getList = async (val: any) => {
+	try {
+		state.loading = true;
+		const res: any = await commonList({ typecode: val });
+		state.commentsList = res.result;
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
 // 选中常用意见
 const handelRepeat = (item: any, index: number) => {
 	const repeatData = [...state.commentsList];
@@ -129,6 +136,13 @@ const handelRepeat = (item: any, index: number) => {
 	}
 	state.chooseCommentList = repeatSelarr.filter((item: any) => item.ischeck);
 };
+const resetState = () => {
+	state.active = 'default';
+	state.manage = false;
+	state.chooseCommentList = [];
+	state.commentsForm.content = '';
+	getList(state.typecode);
+};
 // 删除常用意见
 const deleteComment = () => {
 	if (!state.chooseCommentList.length) {
@@ -145,12 +159,12 @@ const deleteComment = () => {
 		.then(() => {
 			const chooseCommentList = state.chooseCommentList.map((item: any) => {
 				return item.id;
-			})
+			});
 			deleteCommon({ ids: chooseCommentList }).then(() => {
 				ElMessage.success('操作成功');
+				resetState();
 				state.loading = false;
-				closeDialog();
-			})
+			});
 		})
 		.catch(() => {});
 };
@@ -164,8 +178,8 @@ const commentSave = () => {
 				content: state.commentsForm.content,
 			}).then(() => {
 				ElMessage.success('操作成功');
+				resetState();
 				state.loading = false;
-				closeDialog();
 			});
 		} else {
 			return false;

+ 2 - 2
src/views/business/order/components/ExpandForm.vue

@@ -301,9 +301,9 @@
 								v-model="state.expandForm.occurrenceTime"
 								type="datetime"
 								placeholder="请选择争议发生时间"
-								format="YYYY-MM-DD HH:mm:ss"
 								class="w100"
 								clearable
+								value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 							/>
 							<!-- value-format="YYYY-MM-DD HH:mm:ss" -->
 						</el-form-item>
@@ -493,8 +493,8 @@
 								v-model="state.expandForm.productExpiredTime"
 								type="datetime"
 								placeholder="请选择产品有效期"
-								format="YYYY-MM-DD HH:mm:ss"
 								class="w100"
+								value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 							/>
 							<!-- value-format="YYYY-MM-DD HH:mm:ss" -->
 						</el-form-item>

+ 8 - 3
src/views/business/order/components/Process.vue

@@ -45,7 +45,7 @@
 								:rules="[{ required: false, message: '请选择主办', trigger: 'change' }]"
 							>
 								<el-select v-model="state.ruleForm.nextMainHandler" placeholder="请选择主办" class="w100">
-									<el-option v-for="item in state.handlerClassifies" :key="item.id" :label="item.name" :value="item.id" />
+									<el-option v-for="item in state.handerMainOptions" :key="item.id" :label="item.name" :value="item.id" />
 								</el-select>
 							</el-form-item>
 						</el-col>
@@ -77,7 +77,7 @@
 								:rules="[{ required: false, message: '请选择主办', trigger: 'change' }]"
 							>
 								<el-select v-model="state.ruleForm.nextMainHandler" placeholder="请选择主办" class="w100">
-									<el-option v-for="item in state.handerOptions" :key="item.key" :label="item.value" :value="item.key" />
+									<el-option v-for="item in state.handerMainOptions" :key="item.key" :label="item.value" :value="item.key" />
 								</el-select>
 							</el-form-item>
 						</el-col>
@@ -149,7 +149,7 @@
 </template>
 
 <script setup lang="ts" name="orderProcess">
-import { defineAsyncComponent, reactive, ref } from 'vue';
+import { defineAsyncComponent, reactive, ref,computed } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import type { UploadProps } from 'element-plus';
 import { checkFile, fileType } from '/@/utils/tools';
@@ -182,6 +182,7 @@ const state = reactive<any>({
 	workflowId: '', //工单id
 	commonEeum: '',
 	handlerClassifies: [], //撤回处理人
+	handerMainOptions:[],// 主办人
 });
 const ruleFormRef = ref();
 const CommentRef = ref();
@@ -268,6 +269,10 @@ const selectHanders = () => {
 const selectHandersRecall = () => {
 	ruleFormRef.value?.resetFields('nextMainHandler');
 };
+// 主办从处理人中选择
+state.handerMainOptions = computed(()=>{
+	return state.ruleForm.nextHandlers;
+})
 // 设置抽屉
 const mouseup = () => {
 	state.trasform = dialogRef.value.dialogContentRef.$el.style.transform;

+ 253 - 266
src/views/business/order/index.vue

@@ -1,254 +1,234 @@
 <template>
 	<div class="business-oreder-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd15">
-			<el-tabs v-model="state.activeName" class="h100" @tab-change="handleClick">
-				<el-tab-pane :name="item.value" v-for="item in state.tabPaneList" :key="item.value" :label="item.label"></el-tab-pane>
-				<div class="flex-column">
-					<!-- 查询条件 -->
-					<div :class="{ 'search-coloct': !searchCol }" class="search-inner">
-						<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15" label-width="100px">
-							<el-row :gutter="35">
-								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-									<el-form-item label="关键字" prop="Keyword">
-										<el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="getList(state.activeName)" />
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-									<el-form-item label="关键字" prop="Content">
-										<el-input v-model="state.queryParams.Content" placeholder="诉求详情" clearable @keyup.enter="getList(state.activeName)" />
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="受理类型" prop="AcceptType">
-										<el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" multiple clearable class="w100">
-											<el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
-										</el-select>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="来源渠道" prop="Channel">
-										<el-select v-model="state.queryParams.Channel" placeholder="请选择来源渠道" multiple clearable class="w100">
-											<el-option v-for="item in state.channelOptions" :value="item.key" :key="item.key" :label="item.value" />
-										</el-select>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="热点分类" prop="HotspotId">
-										<el-tree-select
-											class="w100"
-											v-model="state.queryParams.HotspotId"
-											filterable
-											clearable
-											multiple
-											:render-after-expand="false"
-											show-checkbox
-											placeholder="请选择热点分类"
-											:props="HotspotProps"
-											lazy
-											:load="load"
-											node-key="id"
-										/>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="部门" prop="OrgCode">
-										<el-cascader
-											:options="state.orgsOptions"
-											filterable
-											:show-all-levels="false"
-											:props="{ checkStrictly: true, value: 'id', label: 'orgName', emitPath: false, multiple: true }"
-											placeholder="请选择所属部门"
-											clearable
-											class="w100"
-											v-model="state.queryParams.OrgCode"
-											ref="cascaderRef"
-											@change="getselKnowledgeList"
-										>
-											<template #default="{ node, data }">
-												<span>{{ data.orgName }}</span>
-												<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
-											</template>
-										</el-cascader>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="受理坐席" prop="NameOrNo">
-										<el-input
-											v-model="state.queryParams.NameOrNo"
-											placeholder="坐席姓名/坐席工号"
-											clearable
-											@keyup.enter="getList(state.activeName)"
-										/>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="受理时间" prop="crTime">
-										<el-date-picker
-											v-model="state.queryParams.crTime"
-											type="daterange"
-											unlink-panels
-											range-separator="至"
-											start-placeholder="开始日期"
-											end-placeholder="结束日期"
-											:shortcuts="shortcuts"
-											format="YYYY-MM-DD"
-											@change="timeStartChangeCr"
-										/>
-										<!-- value-format="YYYY-MM-DD" -->
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="转接来源" prop="TransferPhone">
-										<el-input
-											v-model="state.queryParams.TransferPhone"
-											placeholder="请填写转接来源"
-											clearable
-											@keyup.enter="getList(state.activeName)"
-										/>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="紧急程度" prop="EmergencyLevel">
-										<el-select v-model="state.queryParams.EmergencyLevel" placeholder="请选择受理类型" multiple clearable class="w100">
-											<el-option v-for="item in state.emergencyLevelOptions" :value="item.key" :key="item.key" :label="item.value" />
-										</el-select>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="办理期限" prop="exTime">
-										<el-date-picker
-											v-model="state.queryParams.exTime"
-											type="daterange"
-											unlink-panels
-											range-separator="至"
-											start-placeholder="开始日期"
-											end-placeholder="结束日期"
-											:shortcuts="shortcuts"
-											format="YYYY-MM-DD"
-											@change="timeStartChangeEx"
-										/>
-										<!-- value-format="YYYY-MM-DD" -->
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="电话号码" prop="PhoneNo">
-										<el-input
-											v-model="state.queryParams.PhoneNo"
-											placeholder="来电号码/联系电话"
-											clearable
-											@keyup.enter="getList(state.activeName)"
-										/>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="推送分类" prop="PushTypeCode">
-										<el-select v-model="state.queryParams.PushTypeCode" placeholder="请选择推送分类" clearable class="w100">
-											<el-option
-												v-for="item in state.pushTypeOptions"
-												:value="item.dicDataValue"
-												:key="item.dicDataValue"
-												:label="item.dicDataName"
-											/>
-										</el-select>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
-									<el-form-item label="工单状态" prop="Status">
-										<el-select v-model="state.queryParams.Status" placeholder="请选择工单状态" multiple clearable class="w100">
-											<el-option v-for="item in state.orderStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
-										</el-select>
-									</el-form-item>
-								</el-col>
-							</el-row>
-						</el-form>
-					</div>
-					<!-- 按钮组 -->
-					<div class="w100" style="display: flex; justify-content: flex-end">
-						<el-button type="primary" @click="getList(state.activeName)" :loading="state.loading" v-waves>
-							<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-button link type="primary" @click="closeSearch">
-							{{ searchCol ? '收起' : '展开' }}
-							<SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowDown" class="mr5 arrow" size="18px" />
-						</el-button>
-					</div>
-					<!-- 功能按钮 -->
-					<div class="flex-center-between mb20">
-						<!-- <p class="table-title">信息列表</p> -->
-						<div>
-							<el-button type="primary" @click="onAddWorkOrder" v-waves> <SvgIcon name="ele-Plus" class="mr5" />新增 </el-button>
-							<!-- <el-button type="primary" :disabled="!state.multipleSelection.length" v-waves @click="onImportTable">
+			<!-- <el-tabs v-model="state.activeName" class="h100" @tab-change="handleClick"> -->
+			<!-- <el-tab-pane :name="item.value" v-for="item in state.tabPaneList" :key="item.value" :label="item.label"></el-tab-pane> -->
+			<div class="flex-column">
+				<!-- 查询条件 -->
+				<div :class="{ 'search-coloct': !searchCol }" class="search-inner">
+					<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15" label-width="100px">
+						<el-row :gutter="35">
+							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+								<el-form-item label="关键字" prop="Keyword">
+									<el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="getList(state.activeName)" />
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+								<el-form-item label="关键字" prop="Content">
+									<el-input v-model="state.queryParams.Content" placeholder="诉求详情" clearable @keyup.enter="getList(state.activeName)" />
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="受理类型" prop="AcceptType">
+									<el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" multiple clearable class="w100">
+										<el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+									</el-select>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="来源渠道" prop="Channel">
+									<el-select v-model="state.queryParams.Channel" placeholder="请选择来源渠道" multiple clearable class="w100">
+										<el-option v-for="item in state.channelOptions" :value="item.key" :key="item.key" :label="item.value" />
+									</el-select>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="热点分类" prop="HotspotId">
+									<el-tree-select
+										class="w100"
+										v-model="state.queryParams.HotspotId"
+										filterable
+										clearable
+										multiple
+										:render-after-expand="false"
+										show-checkbox
+										placeholder="请选择热点分类"
+										:props="HotspotProps"
+										lazy
+										:load="load"
+										node-key="id"
+										check-strictly
+									/>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="部门" prop="OrgCode">
+									<el-cascader
+										:options="state.orgsOptions"
+										filterable
+										:show-all-levels="false"
+										:props="{ checkStrictly: true, value: 'id', label: 'orgName', emitPath: false, multiple: true }"
+										placeholder="请选择所属部门"
+										clearable
+										class="w100"
+										v-model="state.queryParams.OrgCode"
+										ref="cascaderRef"
+										@change="getselKnowledgeList"
+									>
+										<template #default="{ node, data }">
+											<span>{{ data.orgName }}</span>
+											<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+										</template>
+									</el-cascader>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="受理坐席" prop="NameOrNo">
+									<el-input v-model="state.queryParams.NameOrNo" placeholder="坐席姓名/坐席工号" clearable @keyup.enter="getList(state.activeName)" />
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="受理时间" prop="crTime">
+									<el-date-picker
+										v-model="state.queryParams.crTime"
+										type="daterange"
+										unlink-panels
+										range-separator="至"
+										start-placeholder="开始日期"
+										end-placeholder="结束日期"
+										:shortcuts="shortcuts"
+										@change="timeStartChangeCr"
+										value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
+									/>
+									<!-- value-format="YYYY-MM-DD" -->
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="转接来源" prop="TransferPhone">
+									<el-input
+										v-model="state.queryParams.TransferPhone"
+										placeholder="请填写转接来源"
+										clearable
+										@keyup.enter="getList(state.activeName)"
+									/>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="紧急程度" prop="EmergencyLevel">
+									<el-select v-model="state.queryParams.EmergencyLevel" placeholder="请选择受理类型" multiple clearable class="w100">
+										<el-option v-for="item in state.emergencyLevelOptions" :value="item.key" :key="item.key" :label="item.value" />
+									</el-select>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="办理期限" prop="exTime">
+									<el-date-picker
+										v-model="state.queryParams.exTime"
+										type="daterange"
+										unlink-panels
+										range-separator="至"
+										start-placeholder="开始日期"
+										end-placeholder="结束日期"
+										:shortcuts="shortcuts"
+										@change="timeStartChangeEx"
+										value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
+									/>
+									<!-- value-format="YYYY-MM-DD" -->
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="电话号码" prop="PhoneNo">
+									<el-input v-model="state.queryParams.PhoneNo" placeholder="来电号码/联系电话" clearable @keyup.enter="getList(state.activeName)" />
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="推送分类" prop="PushTypeCode">
+									<el-select v-model="state.queryParams.PushTypeCode" placeholder="请选择推送分类" clearable class="w100">
+										<el-option v-for="item in state.pushTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+									</el-select>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
+								<el-form-item label="工单状态" prop="Status">
+									<el-select v-model="state.queryParams.Status" placeholder="请选择工单状态" multiple clearable class="w100">
+										<el-option v-for="item in state.orderStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
+									</el-select>
+								</el-form-item>
+							</el-col>
+						</el-row>
+					</el-form>
+				</div>
+				<!-- 按钮组 -->
+				<div class="w100" style="display: flex; justify-content: flex-end">
+					<el-button type="primary" @click="getList(state.activeName)" :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-button link type="primary" @click="closeSearch">
+						{{ searchCol ? '收起' : '展开' }}
+						<SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowDown" class="mr5 arrow" size="18px" />
+					</el-button>
+				</div>
+				<!-- 功能按钮 -->
+				<div class="flex-center-between mb20">
+					<!-- <p class="table-title">信息列表</p> -->
+					<div>
+						<el-button type="primary" @click="onAddWorkOrder"> <SvgIcon name="ele-Plus" class="mr5" />新增 </el-button>
+						<!-- <el-button type="primary" :disabled="!state.multipleSelection.length" v-waves @click="onImportTable">
 								<SvgIcon name="iconfont icon-daochu" class="mr5" />导出
 							</el-button> -->
-						</div>
 					</div>
-					<!-- 表格 -->
-					<el-table
-						:data="state.tableList"
-						v-loading="state.loading"
-						row-key="id"
-						@selection-change="handleSelectionChange"
-						@sort-change="sortChange"
-					>
-						<!-- <el-table-column type="selection" width="55" :reserve-selection="true" /> -->
-						<el-table-column type="index" width="60" label="序号" />
-						<!--  sortable="custom" 工单编码排序 -->
-						<el-table-column label="工单编码" prop="no" show-overflow-tooltip width="150">
-							<template #default="scope">
-								<span>{{ scope.row.no }}</span>
-							</template>
-						</el-table-column>
-						<el-table-column label="标题" show-overflow-tooltip width="400">
-							<template #default="scope">
-								<span style="color: var(--el-color-primary)">{{ scope.row.title }}</span>
-							</template>
-						</el-table-column>
-						<el-table-column label="工单状态" show-overflow-tooltip width="100">
-							<template #default="scope">
-								<!-- 草稿 -->
-								<span style="color: var(--el-color-info)" v-if="scope.row.status === 0">{{ scope.row.statusText }}</span>
-								<!-- 待签收 -->
-								<span style="color: var(--el-color-success)" v-if="scope.row.status === 10">{{ scope.row.statusText }}</span>
-								<!-- 办理中 -->
-								<span style="color: var(--el-color-primary)" v-if="scope.row.status === 20">{{ scope.row.statusText }}</span>
-								<!-- 会签中 -->
-								<span style="color: var(--el-color-primary)" v-if="scope.row.status === 30">{{ scope.row.statusText }}</span>
-								<!-- 退回 -->
-								<span style="color: var(--el-color-danger)" v-if="scope.row.status === 40">{{ scope.row.statusText }}</span>
-								<!-- 办理完成 -->
-								<span style="color: var(--el-color-success)" v-if="scope.row.status === 50">{{ scope.row.statusText }}</span>
-								<!-- 已归档 -->
-								<span style="color: var(--el-color-info)" v-if="scope.row.status === 60">{{ scope.row.statusText }}</span>
-							</template>
-						</el-table-column>
-						<el-table-column prop="currentStepName" label="当前环节" show-overflow-tooltip width="150"></el-table-column>
-						<el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
-						<el-table-column prop="hotspot" label="热点分类" show-overflow-tooltip width="200"></el-table-column>
-						<!--  sortable="custom" 紧急程度排序 -->
-						<el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100">
-							<template #default="scope">
-								<span v-if="scope.row.emergencyLevel === 2 || scope.row.emergencyLevel === 3" style="color: var(--el-color-danger)">{{
-									scope.row.emergencyLevelText
-								}}</span>
-								<span v-else style="color: var(--el-color-primary)">{{ scope.row.emergencyLevelText }}</span>
-							</template>
-						</el-table-column>
-						<!--  sortable="custom" 办理期限排序 -->
-						<el-table-column prop="expiredTime" label="办理期限" show-overflow-tooltip width="170">
-							<template #default="scope">
-								<span>{{ formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-							</template>
-						</el-table-column>
-						<el-table-column prop="employeeName" label="受理坐席" show-overflow-tooltip width="170">
-							<template #default="scope">
-								<span>{{ scope.row.employeeName + '[' + scope.row.employeeStaffNo + ']' }}</span>
-							</template>
-						</el-table-column>
-						<el-table-column label="操作" width="150" fixed="right" align="center">
-							<!-- 草稿0 status 可以删除 -->
-							<template #default="scope">
-								<!-- <el-button text type="primary" @click="onEditTemp(scope.row)" title="修改">
+				</div>
+				<!-- 表格 -->
+				<el-table :data="state.tableList" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange" @sort-change="sortChange">
+					<!-- <el-table-column type="selection" width="55" :reserve-selection="true" /> -->
+					<el-table-column type="index" width="60" label="序号" />
+					<!--  sortable="custom" 工单编码排序 -->
+					<el-table-column label="工单编码" prop="no" show-overflow-tooltip width="150">
+						<template #default="scope">
+							<span>{{ scope.row.no }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="标题" show-overflow-tooltip width="400">
+						<template #default="scope">
+							<span style="color: var(--el-color-primary)">{{ scope.row.title }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="工单状态" show-overflow-tooltip width="100">
+						<template #default="scope">
+							<!-- 草稿 -->
+							<span style="color: var(--el-color-info)" v-if="scope.row.status === 0">{{ scope.row.statusText }}</span>
+							<!-- 待签收 -->
+							<span style="color: var(--el-color-success)" v-if="scope.row.status === 10">{{ scope.row.statusText }}</span>
+							<!-- 办理中 -->
+							<span style="color: var(--el-color-primary)" v-if="scope.row.status === 20">{{ scope.row.statusText }}</span>
+							<!-- 会签中 -->
+							<span style="color: var(--el-color-primary)" v-if="scope.row.status === 30">{{ scope.row.statusText }}</span>
+							<!-- 退回 -->
+							<span style="color: var(--el-color-danger)" v-if="scope.row.status === 40">{{ scope.row.statusText }}</span>
+							<!-- 办理完成 -->
+							<span style="color: var(--el-color-success)" v-if="scope.row.status === 50">{{ scope.row.statusText }}</span>
+							<!-- 已归档 -->
+							<span style="color: var(--el-color-info)" v-if="scope.row.status === 60">{{ scope.row.statusText }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="currentStepName" label="当前环节" show-overflow-tooltip width="150"></el-table-column>
+					<el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+					<el-table-column prop="hotspot" label="热点分类" show-overflow-tooltip width="200"></el-table-column>
+					<!--  sortable="custom" 紧急程度排序 -->
+					<el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100">
+						<template #default="scope">
+							<span v-if="scope.row.emergencyLevel === 2 || scope.row.emergencyLevel === 3" style="color: var(--el-color-danger)">{{
+								scope.row.emergencyLevelText
+							}}</span>
+							<span v-else style="color: var(--el-color-primary)">{{ scope.row.emergencyLevelText }}</span>
+						</template>
+					</el-table-column>
+					<!--  sortable="custom" 办理期限排序 -->
+					<el-table-column prop="expiredTime" label="办理期限" show-overflow-tooltip width="170">
+						<template #default="scope">
+							<span>{{ formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="employeeName" label="受理坐席" show-overflow-tooltip width="170">
+						<template #default="scope">
+							<span>{{ scope.row.employeeName + '[' + scope.row.employeeStaffNo + ']' }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" width="150" fixed="right" align="center">
+						<!-- 草稿0 status 可以删除 -->
+						<template #default="scope">
+							<!-- <el-button text type="primary" @click="onEditTemp(scope.row)" title="修改">
 								修改
 							</el-button>
 							<el-button text type="success" v-if="scope.row.status === 0" @click="onReleaseTemp(scope.row)" title="发布">
@@ -257,23 +237,23 @@
 							<el-button text type="warning" v-if="scope.row.status === 2" @click="tempEnable(scope.row)" title="启用">
 								启用
 							</el-button>-->
-								<el-button text type="primary" @click="onOrderDetail(scope.row)" title="详情"> 详情 </el-button>
-								<el-button text v-if="scope.row.status === 0" type="danger" @click="onDeleteOrder(scope.row)" title="删除"> 删除 </el-button>
-							</template>
-						</el-table-column>
-						<template #empty>
-							<Empty />
+							<el-button text type="primary" @click="onOrderDetail(scope.row)" title="详情"> 详情 </el-button>
+							<el-button text v-if="scope.row.status === 0" type="danger" @click="onDeleteOrder(scope.row)" title="删除"> 删除 </el-button>
 						</template>
-					</el-table>
-					<!-- 分页 -->
-					<pagination
-						:total="state.total"
-						v-model:page="state.queryParams.PageIndex"
-						v-model:limit="state.queryParams.PageSize"
-						@pagination="getList(state.activeName)"
-					/>
-				</div>
-			</el-tabs>
+					</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="getList(state.activeName)"
+				/>
+			</div>
+			<!-- </el-tabs> -->
 		</div>
 		<!-- 工单详情 -->
 		<Detail ref="detailRef" @updateList="getList(state.activeName)" />
@@ -436,9 +416,12 @@ const getBaseData = async () => {
 /** 获取列表 */
 const getList = (val: string) => {
 	state.loading = true;
+	let request = JSON.parse(JSON.stringify(state.queryParams));
+	Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
+	Reflect.deleteProperty(request, 'exTime'); // 删除无用的参数
 	switch (val) {
 		case 'all':
-			orderList(state.queryParams)
+			orderList(request)
 				.then((response: any) => {
 					state.tableList = response?.result.items ?? [];
 					state.total = response?.result.total;
@@ -530,12 +513,16 @@ const sortChange = (column: any) => {
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
+	state.queryParams.CreationTimeStart = '';
+	state.queryParams.CreationTimeEnd = '';
+	state.queryParams.ExpiredTimeStart = '';
+	state.queryParams.ExpiredTimeStart = '';
 	getList(state.activeName);
 };
 // 切换tab 查询列表
-const handleClick = (val: string) => {
-	getList(val);
-};
+// const handleClick = (val: string) => {
+// 	getList(val);
+// };
 // 多选表格
 const handleSelectionChange = (val: any) => {
 	state.multipleSelection = val;
@@ -604,7 +591,7 @@ onActivated(() => {
 	.flex-column {
 		display: flex;
 		flex-direction: column;
-		height: calc(100% - 55px);
+		height: 100%;
 		.el-table {
 			flex: 1;
 		}

+ 117 - 0
src/views/knowledge/apply/component/Detail.vue

@@ -0,0 +1,117 @@
+<template>
+	<div class="knowledge-apply-add-container">
+		<el-dialog title="发起申请" v-model="state.isShowDialog" width="700px" draggable>
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请类型">
+							{{ state.ruleForm.knowledgeApplyType === 0 ? '新增' : '更新' }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="诉求处理部门">
+							{{ state.ruleForm.department }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请人">
+							{{ state.ruleForm.creationName }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请部门">
+							{{ state.ruleForm.creationBMName }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.expiredTime">
+						<el-form-item label="截止时间">
+							{{ formatDate(state.info.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="诉求内容">
+							{{ state.ruleForm.content }}
+						</el-form-item>
+					</el-col>
+					<el-divider />
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.kbTitle">
+						<el-form-item label="关联知识">
+							<span style="color: var(--el-color-primary)">
+								{{ state.ruleForm.kbTitle }}
+							</span>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="处理人">
+							{{ state.ruleForm.processor }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.handleTime">
+						<el-form-item label="处理完成时间">
+							{{ formatDate(state.info.handleTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.returnTime">
+						<el-form-item label="退回时间">
+							{{ formatDate(state.info.returnTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.opinion">
+						<el-form-item :label="state.ruleForm.returnTime ? '退回原因' : '备注'">
+							{{ state.ruleForm.opinion }}
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" class="default-button">关 闭</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup lang="ts" name="knowledgeApplyDetail">
+import { reactive, ref } from 'vue';
+import { formatDate } from '/@/utils/formatTime';
+import { KnowledgeApplyDetail } from '/@/api/knowledge/apply';
+
+// 定义变量内容
+const ruleFormRef = ref<any>();
+const state = reactive<any>({
+	isShowDialog: false,
+	ruleForm: {
+		knowledgeApplyType: 1,
+		KnowledgeId: '',
+	},
+	orgData: [], // 上级
+	loading: false,
+	identityTypeOptions: [],
+});
+// 打开弹窗
+const openDialog = async (row: any) => {
+	state.loading = true;
+	try {
+		const res: any = await KnowledgeApplyDetail(row.id);
+		state.ruleForm = res.result ?? {};
+		state.isShowDialog = true;
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.isShowDialog = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 187 - 0
src/views/knowledge/apply/component/Handle.vue

@@ -0,0 +1,187 @@
+<template>
+	<div class="knowledge-apply-add-container">
+		<el-dialog title="知识申请处理" v-model="state.isShowDialog" draggable>
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<span class="font16"><b>基本信息</b></span>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="诉求类型">
+							{{ state.ruleForm.knowledgeApplyType === 0 ? '新增' : '更新' }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="诉求处理部门">
+							{{ state.ruleForm.department }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请人"> </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请部门"> </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="截止时间">
+							{{ formatDate(state.info.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="关联知识"> </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="诉求内容">
+							{{ state.ruleForm.content }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<span class="font16"><b>办理信息</b></span>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="关联知识" prop="knowledgeId" :rules="[{ required: true, message: '请选择关联知识', trigger: 'change' }]">
+							<template #label>
+								<div style="height: 34px; display: flex; align-items: center">
+									关联知识
+									<el-tooltip placement="top">
+										<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
+										<template #content>
+											温馨提示:
+											<br />
+											1、新增诉求:已有对应知识时,请选择对应知识进行关联;没有对应知识时,请先新增知识,然后再进行关联 <br />
+											2、更新诉求:需先更新对应知识,方可进行关联;若知识库未按照要求更新,直接关联,将影响部门指标考核
+										</template>
+									</el-tooltip>
+								</div>
+							</template>
+							<el-select
+								v-model="state.ruleForm.knowledgeId"
+								value-key="dicDataValue"
+								clearable
+								filterable
+								placeholder="请选择关联知识"
+								style="width: 80%"
+							>
+								<el-option v-for="item in state.knowledgeOptions" :key="item.id" :label="item.title" :value="item.id" />
+							</el-select>
+							<el-button type="primary" link class="ml10" @click="createKnowledge">创建知识</el-button>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="备注" prop="opinion" :rules="[{ required: false, message: '请填写备注', trigger: 'blur' }]">
+							<el-input
+								style="width: 80%"
+								v-model="state.ruleForm.opinion"
+								type="textarea"
+								:autosize="{ minRows: 6, maxRows: 8 }"
+								placeholder="请填写备注"
+								clearable
+								maxlength="2000"
+							>
+							</el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup lang="ts" name="knowledgeApplyHandle">
+import { reactive, ref, onMounted } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { useRouter } from 'vue-router';
+import { formatDate } from '/@/utils/formatTime';
+import { KnowledgeApplyDetail, KnowledgeHandle } from '/@/api/knowledge/apply';
+import { KnowledgeGetknowledge } from '/@/api/knowledge';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const ruleFormRef = ref<any>();
+const state = reactive<any>({
+	isShowDialog: false,
+	ruleForm: {
+		knowledgeApplyType: 1,
+		KnowledgeId: '',
+	},
+	orgData: [], // 上级
+	loading: false,
+	knowledgeOptions: [],
+});
+const router = useRouter();
+// 打开弹窗
+const openDialog = async (row: any) => {
+	state.loading = true;
+	try {
+		const res: any = await KnowledgeApplyDetail(row.id);
+		state.ruleForm = res.result ?? {};
+		state.isShowDialog = true;
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.isShowDialog = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+// 创建知识
+const createKnowledge = () => {
+	state.isShowDialog = false;
+	router.push({
+		path: '/knowledge/add',
+	});
+};
+// 保存
+const onSubmit = async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid, fields) => {
+		if (valid) {
+			state.loading = true;
+			const request = {
+				id: state.ruleForm.id,
+				knowledgeId: state.ruleForm.knowledgeId,
+				opinion: state.ruleForm.opinion,
+			};
+			KnowledgeHandle(request)
+				.then(() => {
+					emit('updateList');
+					closeDialog(); // 关闭弹窗
+					state.loading = false;
+					ElMessage.success('新增成功');
+				})
+				.catch(() => {
+					state.loading = false;
+				});
+		} else {
+			state.loading = false;
+			console.log('error submit!', fields);
+		}
+	});
+};
+onMounted(async () => {
+	try {
+		const res: any = await KnowledgeGetknowledge({ PageIndex: 1, PageSize: 99 });
+		state.knowledgeOptions = res.result?.items ?? [];
+	} catch (error) {
+		console.log(error);
+	}
+});
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 102 - 59
src/views/knowledge/apply/index.vue

@@ -1,46 +1,42 @@
 <template>
 	<div class="knowledge-apply-container layout-pd">
 		<el-card shadow="never">
-			<el-tabs v-model="queryParams.Status" @tab-change="handleClick">
-				<el-tab-pane label="全部" name="0"></el-tab-pane>
-				<el-tab-pane label="处理中" name="1"></el-tab-pane>
-				<el-tab-pane label="处理完成" name="2"></el-tab-pane>
-				<el-tab-pane label="已退回" name="3"></el-tab-pane>
-				<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+			<el-tabs v-model="state.queryParams.Status" @tab-change="handleClick">
+				<el-tab-pane label="全部" name=" "></el-tab-pane>
+				<el-tab-pane label="待处理" name="0"></el-tab-pane>
+				<el-tab-pane label="处理完成" name="1"></el-tab-pane>
+				<el-tab-pane label="已退回" name="2"></el-tab-pane>
+				<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 					<el-form-item label="申请类型" prop="ApplyType">
-						<el-select v-model="queryParams.ApplyType" placeholder="请选择申请类型" class="w100">
-							<el-option v-for="item in directionList" :key="item.value" :label="item.label" :value="item.value" />
+						<el-select v-model="state.queryParams.ApplyType" placeholder="请选择申请类型" class="w100">
+							<el-option v-for="item in state.ApplyTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
 					</el-form-item>
-					<el-form-item label="申请人" prop="street">
-						<el-input v-model="queryParams.street" placeholder="请填写申请人" clearable> </el-input>
-					</el-form-item>
-					<el-form-item label="申请部门" prop="street">
-						<el-input v-model="queryParams.street" placeholder="请填写申请部门" clearable> </el-input>
+					<el-form-item label="关键字" prop="Keyword">
+						<el-input v-model="state.queryParams.Keyword" @keyup.enter="getList" placeholder="申请人/申请部门" clearable> </el-input>
 					</el-form-item>
 					<el-form-item label="创建时间" prop="crTime">
 						<el-date-picker
 							v-model="state.queryParams.crTime"
-							type="daterange"
+							type="datetimerange"
 							unlink-panels
 							range-separator="至"
 							start-placeholder="开始日期"
 							end-placeholder="结束日期"
 							:shortcuts="shortcuts"
-							format="YYYY-MM-DD"
 							@change="tiemChange"
+							value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 						/>
 						<!-- value-format="YYYY-MM-DD" -->
 					</el-form-item>
 					<el-form-item label="是否超时" prop="IsOvertime">
-						<el-select v-model="queryParams.IsOvertime" placeholder="请选择是否超时" class="w100">
-							<el-option label="" value="1" />
-							<el-option label="" value="0" />
+						<el-select v-model="state.queryParams.IsOvertime" placeholder="请选择是否超时" class="w100">
+							<el-option label="" value="1" />
+							<el-option label="" value="0" />
 						</el-select>
 					</el-form-item>
-
 					<el-form-item>
-						<el-button type="primary" @click="getList" :loading="loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+						<el-button type="primary" @click="getList" :loading="state.loading" v-waves> <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>
@@ -56,46 +52,56 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableList" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
-				<el-table-column prop="fromNo" label="申请内容" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="toNo" label="申请类型" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="content" label="申请内容" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="knowledgeApplyType" label="申请类型" show-overflow-tooltip>
+					<template #default="{ row }">
+						<span>
+							{{ row.knowledgeApplyType === 0 ? '新增' : '更新' }}
+						</span>
+					</template>
+				</el-table-column>
 				<el-table-column label="状态" show-overflow-tooltip>
-					<template #default="scope">
-						<el-button text type="primary">
-							{{ scope.row.toNo }}
-						</el-button>
+					<template #default="{ row }">
+						<span style="color: var(--el-color-primary)" v-if="row.status === 0">待处理</span>
+						<span style="color: var(--el-color-success)" v-if="row.status === 1">处理完成</span>
+						<span style="color: var(--el-color-danger)" v-if="row.status === 2">已退回</span>
 					</template>
 				</el-table-column>
-
+				<el-table-column prop="content" label="处理人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="creationName" label="申请人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="creationOrgName" label="部门名称" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="toNo" label="创建时间" show-overflow-tooltip width="170">
 					<template #default="scope">
 						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
+				<el-table-column prop="toNo" label="截止时间" show-overflow-tooltip width="170">
+					<template #default="scope">
+						<span>{{ formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
 				<el-table-column prop="toNo" label="处理完成时间" show-overflow-tooltip width="170">
 					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						<span>{{ formatDate(scope.row.handleTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="退回时间" show-overflow-tooltip width="170">
 					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						<span>{{ formatDate(scope.row.returnTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column label="是否超时" show-overflow-tooltip>
-					<template #default="scope">
-						<el-button text type="primary">
-							{{ scope.row.toNo }}
-						</el-button>
+					<template #default="{ row }">
+						{{ row.isOvertime ? '是' : '否' }}
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="120" fixed="right" align="center">
-					<template #default="scope">
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="查看详情"> 查看详情 </el-button>
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="编辑"> 编辑 </el-button>
-						<el-button text type="danger" @click="onPalySoundRecording(scope.row)" title="撤回"> </el-button>
-						<el-button text type="danger" @click="onPalySoundRecording(scope.row)" title="删除"> 删除 </el-button>
+				<el-table-column label="操作" width="180" fixed="right" align="center">
+					<template #default="{ row }">
+						<el-button text type="primary" @click="onDetail(row)" title="查看详情" v-if="[1, 2].includes(row.status)"> 查看详情 </el-button>
+						<el-button text type="primary" @click="onHandle(row)" title="处理" v-if="[0].includes(row.status)"> 处理 </el-button>
+						<el-button text type="danger" @click="onReturn(row)" title="退回" v-if="[0].includes(row.status)"> 退回 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -103,23 +109,28 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
+		<Detail ref="DetailRef" />
+		<Handle ref="HandleRef" @updateList="getList" />
 	</div>
 </template>
 
 <script lang="ts" setup name="knowledgeApply">
-import { ref, reactive, toRefs, onMounted } from 'vue';
+import { ref, reactive, onMounted,defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { ElMessage } from 'element-plus';
+import { ElMessage, ElMessageBox } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 // 引入节流
 import { throttle } from '/@/utils/tools';
-import { KnowledgeApply } from '/@/api/knowledge/apply';
+import { KnowledgeApply, KnowledgeReturn } from '/@/api/knowledge/apply';
 
+// 引入组件
+const Detail = defineAsyncComponent(() => import('/@/views/knowledge/apply/component/Detail.vue'));
+const Handle = defineAsyncComponent(() => import('/@/views/knowledge/apply/component/Handle.vue'));
 
 const shortcuts = [
 	{
@@ -156,7 +167,7 @@ const state = reactive(<any>{
 	queryParams: {
 		PageIndex: 1,
 		PageSize: 10,
-		Status: '0',
+		Status: ' ',
 		ApplyType: '',
 		IsOvertime: '',
 		StartTime: '',
@@ -166,25 +177,22 @@ const state = reactive(<any>{
 	loading: false,
 	total: 0,
 	multipleSelection: [],
-	directionList: [
-		{
-			label: '全部',
-			value: '',
-		},
+	ApplyTypeOptions: [
 		{
-			label: '呼入',
+			label: '新增',
 			value: 0,
 		},
 		{
-			label: '呼出',
+			label: '修改',
 			value: 1,
 		},
 	],
 });
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
-const { queryParams, tableList, loading, total, directionList } = toRefs(state);
 const ruleFormRef = ref<FormInstance>();
+const DetailRef = ref();
+const HandleRef = ref();
 // 创建时间
 const tiemChange = (val: string[]) => {
 	state.queryParams.StartTime = val[0];
@@ -192,9 +200,10 @@ const tiemChange = (val: string[]) => {
 };
 /** 获取用户列表 */
 const getList = () => {
-	queryParams.value.PageIndex = 1;
 	state.loading = true;
-	KnowledgeApply(queryParams.value)
+	let request = JSON.parse(JSON.stringify(state.queryParams));
+	Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
+	KnowledgeApply(request)
 		.then((response: any) => {
 			state.tableList = response?.result.items ?? [];
 			state.total = response?.result.total;
@@ -212,15 +221,49 @@ const handleSelectionChange = (val: any) => {
 const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
+	state.queryParams.PageIndex = 1;
 	getList();
 }, 1000);
 // 切换tab 查询列表
 const handleClick = () => {
-	getList();
+	resetQuery();
+};
+// 查看详情
+const onDetail = (row:any) => {
+	DetailRef.value.openDialog(row)
+};
+// 处理
+const onHandle = (row:any) => {
+	HandleRef.value.openDialog(row)
+};
+// 退回
+const onReturn = (row: any) => {
+	ElMessageBox.prompt('退回原因', '提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		inputPlaceholder: '请输入退回原因,不超过50字符',
+		draggable: true,
+		inputErrorMessage: '请输入退回原因',
+		inputType: 'textarea',
+		inputValidator: (value) => {
+			if (value) return true;
+			else return '请输入退回原因';
+		},
+	})
+		.then(({ value }) => {
+			let req = {
+				id: row.id,
+				opinion: value,
+			};
+			KnowledgeReturn(req)
+				.then(() => {
+					ElMessage.success('操作成功');
+					getList();
+				})
+				.catch(() => {});
+		})
+		.catch(() => {});
 };
-const onPalySoundRecording = (row:any)=>{
-
-}
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [

+ 49 - 28
src/views/knowledge/apply/my/component/Apply.vue → src/views/knowledge/apply/my/component/Add.vue

@@ -1,20 +1,20 @@
 <template>
 	<div class="knowledge-apply-add-container">
-		<el-dialog title="发起申请" v-model="state.isShowDialog" width="700px" draggable>
+		<el-dialog title="发起申请" v-model="state.isShowDialog" draggable>
 			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="申请类型" prop="knowledgeApplyType" :rules="[{ required: true, message: '请选择申请类型', trigger: 'change' }]">
 							<el-radio-group v-model="state.ruleForm.knowledgeApplyType">
-								<el-radio :label="1">新增</el-radio>
-								<el-radio :label="0">更新</el-radio>
+								<el-radio :label="0">新增</el-radio>
+								<el-radio :label="1">更新</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === '2'">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === 1">
 						<el-form-item label="关联知识" prop="knowledgeId" :rules="[{ required: true, message: '请选择关联知识', trigger: 'change' }]">
 							<el-select v-model="state.ruleForm.knowledgeId" value-key="dicDataValue" clearable filterable placeholder="请选择关联知识" class="w100">
-								<el-option v-for="item in state.identityTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+								<el-option v-for="item in state.knowledgeOptions" :key="item.id" :label="item.title" :value="item.id" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -31,13 +31,13 @@
 							</el-input>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === 0">
 						<el-form-item label="处理部门" prop="departmentId" :rules="[{ required: true, message: '请选择处理部门', trigger: 'change' }]">
 							<el-cascader
 								:options="state.orgData"
 								filterable
 								:props="{ checkStrictly: true, value: 'id', label: 'orgName', emitPath: false }"
-								placeholder="请选择处理部门"
+								placeholder="请选择处理部门"
 								clearable
 								class="w100"
 								v-model="state.ruleForm.departmentId"
@@ -51,18 +51,29 @@
 							</el-cascader>
 						</el-form-item>
 					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-else>
+						<el-form-item label="部门名称" prop="department">
+							{{ state.ruleForm.department }}
+						</el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="截止日期" prop="sort" :rules="[{ required: false, message: '请选择截止日期', trigger: 'change' }]">
+						<el-form-item label="截止日期" prop="expiredTime" :rules="[{ required: false, message: '请选择截止日期', trigger: 'change' }]">
 							<template #label>
 								<div style="height: 34px; display: flex; align-items: center">
-									<el-tooltip>
-										<SvgIcon name="ele-QuestionFilled" size="18px" class="mr3" />
+									截止日期
+									<el-tooltip placement="top">
+										<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
 										<template #content> 超过处理截止日期未反馈,将影响处理部门绩效考核,请谨慎设置 </template>
 									</el-tooltip>
-									截止日期
 								</div>
 							</template>
-							<el-date-picker v-model="state.ruleForm.expiredTime" type="date" placeholder="请选择截止日期" class="w100" />
+							<el-date-picker
+								v-model="state.ruleForm.expiredTime"
+								type="date"
+								placeholder="请选择截止日期"
+								class="w100"
+								value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
+							/>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -78,10 +89,9 @@
 </template>
 
 <script setup lang="ts" name="knowledgeApplyAdd">
-import { reactive, ref, onMounted } from 'vue';
+import { reactive, ref, watch } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import { KnowledgeApplyAdd } from '/@/api/knowledge/apply';
-import { getOrgList } from '/@/api/system/organize';
 
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
@@ -91,17 +101,18 @@ const ruleFormRef = ref<any>();
 const state = reactive<any>({
 	isShowDialog: false,
 	ruleForm: {
-		knowledgeApplyType: 1,
-		KnowledgeId: '',
+		knowledgeApplyType: 0,
 	},
 	orgData: [], // 上级
 	loading: false,
-	identityTypeOptions: [],
+	knowledgeOptions: [], //关联知识列表
 });
 // 打开弹窗
-const openDialog = () => {
+const openDialog = (orgData: any, knowledgeOptions: any) => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
+	state.orgData = orgData;
+	state.knowledgeOptions = knowledgeOptions;
 	state.isShowDialog = true;
 };
 // 关闭弹窗
@@ -118,26 +129,36 @@ const getselKnowledgeList = () => {
 	let currentNode = cascaderRef.value.getCheckedNodes();
 	state.ruleForm.department = currentNode[0]?.label ?? '';
 };
+watch(
+	() => state.ruleForm.knowledgeId,
+	(val) => {
+		const item = state.knowledgeOptions.find((v: any) => v.id === val);
+		state.ruleForm.department = item.department;
+		state.ruleForm.departmentId = item.departmentId;
+	}
+);
 // 新增
 const onSubmit = async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	await formEl.validate((valid, fields) => {
 		if (valid) {
-			KnowledgeApplyAdd(state.ruleForm).then(() => {
-				emit('updateList');
-				closeDialog(); // 关闭弹窗
-				ElMessage.success('新增成功');
-			});
+			state.loading = true;
+			KnowledgeApplyAdd(state.ruleForm)
+				.then(() => {
+					emit('updateList');
+					closeDialog(); // 关闭弹窗
+					state.loading = false;
+					ElMessage.success('新增成功');
+				})
+				.catch(() => {
+					state.loading = false;
+				});
 		} else {
+			state.loading = false;
 			console.log('error submit!', fields);
 		}
 	});
 };
-onMounted(() => {
-	getOrgList().then((res: any) => {
-		state.orgData = res?.result ?? [];
-	});
-});
 // 暴露变量
 defineExpose({
 	openDialog,

+ 117 - 0
src/views/knowledge/apply/my/component/Detail.vue

@@ -0,0 +1,117 @@
+<template>
+	<div class="knowledge-apply-add-container">
+		<el-dialog title="申请详情" v-model="state.isShowDialog" draggable>
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请类型">
+							{{ state.ruleForm.knowledgeApplyType === 0 ? '新增' : '更新' }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="诉求处理部门">
+							{{ state.ruleForm.department }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请人">
+							{{ state.ruleForm.creationName }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请部门">
+							{{ state.ruleForm.creationBMName }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12"  v-if="state.ruleForm.expiredTime">
+						<el-form-item label="截止时间">
+							{{ formatDate(state.info.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="诉求内容">
+							{{ state.ruleForm.content }}
+						</el-form-item>
+					</el-col>
+					<el-divider />
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.kbTitle">
+						<el-form-item label="关联知识">
+							<span style="color: var(--el-color-primary)">
+								{{ state.ruleForm.kbTitle }}
+							</span>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.processor">
+						<el-form-item label="处理人">
+							{{ state.ruleForm.processor }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.handleTime">
+						<el-form-item label="处理完成时间">
+							{{ formatDate(state.info.handleTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.returnTime">
+						<el-form-item label="退回时间">
+							{{ formatDate(state.info.returnTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.opinion">
+						<el-form-item label="备注">
+							{{ state.ruleForm.opinion }}
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" class="default-button">关 闭</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup lang="ts" name="knowledgeMyApplyDetail">
+import { reactive, ref } from 'vue';
+import { formatDate } from '/@/utils/formatTime';
+import { KnowledgeApplyDetail } from '/@/api/knowledge/apply';
+
+// 定义变量内容
+const ruleFormRef = ref<any>();
+const state = reactive<any>({
+	isShowDialog: false,
+	ruleForm: {
+		knowledgeApplyType: 1,
+		KnowledgeId: '',
+	},
+	orgData: [], // 上级
+	loading: false,
+	identityTypeOptions: [],
+});
+// 打开弹窗
+const openDialog = async (row: any) => {
+	state.loading = true;
+	try {
+		const res: any = await KnowledgeApplyDetail(row.id);
+		state.ruleForm = res.result ?? {};
+		state.isShowDialog = true;
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.isShowDialog = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 49 - 28
src/views/knowledge/apply/my/component/edit.vue

@@ -1,20 +1,20 @@
 <template>
 	<div class="knowledge-apply-add-container">
-		<el-dialog title="发起申请" v-model="state.isShowDialog" width="700px" draggable>
-			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="80px">
+		<el-dialog title="编辑申请" v-model="state.isShowDialog" draggable>
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="申请类型" prop="knowledgeApplyType" :rules="[{ required: true, message: '请选择申请类型', trigger: 'change' }]">
 							<el-radio-group v-model="state.ruleForm.knowledgeApplyType">
-								<el-radio :label="1">新增</el-radio>
-								<el-radio :label="0">更新</el-radio>
+								<el-radio :label="0">新增</el-radio>
+								<el-radio :label="1">更新</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === '2'">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === 1">
 						<el-form-item label="关联知识" prop="knowledgeId" :rules="[{ required: true, message: '请选择关联知识', trigger: 'change' }]">
 							<el-select v-model="state.ruleForm.knowledgeId" value-key="dicDataValue" clearable filterable placeholder="请选择关联知识" class="w100">
-								<el-option v-for="item in state.identityTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+								<el-option v-for="item in state.knowledgeOptions" :key="item.id" :label="item.title" :value="item.id" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -31,13 +31,13 @@
 							</el-input>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === 0">
 						<el-form-item label="处理部门" prop="departmentId" :rules="[{ required: true, message: '请选择处理部门', trigger: 'change' }]">
 							<el-cascader
 								:options="state.orgData"
 								filterable
 								:props="{ checkStrictly: true, value: 'id', label: 'orgName', emitPath: false }"
-								placeholder="请选择处理部门"
+								placeholder="请选择处理部门"
 								clearable
 								class="w100"
 								v-model="state.ruleForm.departmentId"
@@ -51,18 +51,29 @@
 							</el-cascader>
 						</el-form-item>
 					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-else>
+						<el-form-item label="部门名称" prop="department">
+							{{ state.ruleForm.department }}
+						</el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="截止日期" prop="sort" :rules="[{ required: false, message: '请选择截止日期', trigger: 'change' }]">
+						<el-form-item label="截止日期" prop="expiredTime" :rules="[{ required: false, message: '请选择截止日期', trigger: 'change' }]">
 							<template #label>
 								<div style="height: 34px; display: flex; align-items: center">
-									<el-tooltip>
-										<SvgIcon name="ele-QuestionFilled" size="18px" class="mr3" />
+									截止日期
+									<el-tooltip placement="top">
+										<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
 										<template #content> 超过处理截止日期未反馈,将影响处理部门绩效考核,请谨慎设置 </template>
 									</el-tooltip>
-									截止日期
 								</div>
 							</template>
-							<el-date-picker v-model="state.ruleForm.expiredTime" type="date" placeholder="请选择截止日期" class="w100" />
+							<el-date-picker
+								v-model="state.ruleForm.expiredTime"
+								type="date"
+								placeholder="请选择截止日期"
+								class="w100"
+								value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
+							/>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -77,11 +88,10 @@
 	</div>
 </template>
 
-<script setup lang="ts" name="knowledgeApplyAdd">
-import { reactive, ref, onMounted } from 'vue';
+<script setup lang="ts" name="knowledgeEdit">
+import { reactive, ref, watch } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
-import { KnowledgeApplyAdd } from '/@/api/knowledge/apply';
-import { getOrgList } from '/@/api/system/organize';
+import { KnowledgeApplyUpdate, KnowledgeApplyDetail } from '/@/api/knowledge/apply';
 
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
@@ -96,13 +106,21 @@ const state = reactive<any>({
 	},
 	orgData: [], // 上级
 	loading: false,
-	identityTypeOptions: [],
+	knowledgeOptions: [], //关联知识列表
 });
 // 打开弹窗
-const openDialog = () => {
-	ruleFormRef.value?.clearValidate();
-	ruleFormRef.value?.resetFields();
-	state.isShowDialog = true;
+const openDialog = async (row: any, orgData: any, knowledgeOptions: any) => {
+	try {
+		const res: any = await KnowledgeApplyDetail(row.id);
+		state.ruleForm = res.result ?? {};
+		ruleFormRef.value?.clearValidate();
+		ruleFormRef.value?.resetFields();
+		state.orgData = orgData;
+		state.knowledgeOptions = knowledgeOptions;
+		state.isShowDialog = true;
+	} catch (error) {
+		state.loading = false;
+	}
 };
 // 关闭弹窗
 const closeDialog = () => {
@@ -118,12 +136,20 @@ const getselKnowledgeList = () => {
 	let currentNode = cascaderRef.value.getCheckedNodes();
 	state.ruleForm.department = currentNode[0]?.label ?? '';
 };
+watch(
+	() => state.ruleForm.knowledgeId,
+	(val) => {
+		const item = state.knowledgeOptions.find((v: any) => v.id === val);
+		state.ruleForm.department = item.department;
+		state.ruleForm.departmentId = item.departmentId;
+	}
+);
 // 新增
 const onSubmit = async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	await formEl.validate((valid, fields) => {
 		if (valid) {
-			KnowledgeApplyAdd(state.ruleForm).then(() => {
+			KnowledgeApplyUpdate(state.ruleForm).then(() => {
 				emit('updateList');
 				closeDialog(); // 关闭弹窗
 				ElMessage.success('新增成功');
@@ -133,11 +159,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
 		}
 	});
 };
-onMounted(() => {
-	getOrgList().then((res: any) => {
-		state.orgData = res?.result ?? [];
-	});
-});
 // 暴露变量
 defineExpose({
 	openDialog,

+ 126 - 60
src/views/knowledge/apply/my/index.vue

@@ -1,40 +1,40 @@
 <template>
 	<div class="knowledge-apply-my-container layout-pd">
 		<el-card shadow="never">
-			<el-tabs v-model="queryParams.Status" @tab-change="handleClick">
-				<el-tab-pane label="全部" name="0"></el-tab-pane>
-				<el-tab-pane label="处理中" name="1"></el-tab-pane>
-				<el-tab-pane label="处理完成" name="2"></el-tab-pane>
-				<el-tab-pane label="已退回" name="3"></el-tab-pane>
-				<el-tab-pane label="已撤回" name="4"></el-tab-pane>
-				<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+			<el-tabs v-model="state.queryParams.Status" @tab-change="handleClick">
+				<el-tab-pane label="全部" name=" "></el-tab-pane>
+				<el-tab-pane label="处理中" name="0"></el-tab-pane>
+				<el-tab-pane label="处理完成" name="1"></el-tab-pane>
+				<el-tab-pane label="已退回" name="2"></el-tab-pane>
+				<el-tab-pane label="已撤销" name="3"></el-tab-pane>
+				<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 					<el-form-item label="申请类型" prop="ApplyType">
-						<el-select v-model="queryParams.ApplyType" placeholder="请选择申请类型" class="w100">
-							<el-option v-for="item in directionList" :key="item.value" :label="item.label" :value="item.value" />
+						<el-select v-model="state.queryParams.ApplyType" placeholder="请选择申请类型" class="w100">
+							<el-option v-for="item in state.ApplyTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="是否超时" prop="IsOvertime">
-						<el-select v-model="queryParams.IsOvertime" placeholder="请选择是否超时" class="w100">
-							<el-option label="" value="1" />
-							<el-option label="" value="0" />
+						<el-select v-model="state.queryParams.IsOvertime" placeholder="请选择是否超时" class="w100">
+							<el-option label="" value="1" />
+							<el-option label="" value="0" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="创建时间" prop="crTime">
 						<el-date-picker
 							v-model="state.queryParams.crTime"
-							type="daterange"
+							type="datetimerange"
 							unlink-panels
 							range-separator="至"
 							start-placeholder="开始日期"
 							end-placeholder="结束日期"
 							:shortcuts="shortcuts"
-							format="YYYY-MM-DD"
 							@change="tiemChange"
+							value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 						/>
 						<!-- value-format="YYYY-MM-DD" -->
 					</el-form-item>
 					<el-form-item>
-						<el-button type="primary" @click="getList" :loading="loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+						<el-button type="primary" @click="getList" :loading="state.loading" v-waves> <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>
@@ -51,18 +51,24 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableList" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
-				<el-table-column prop="fromNo" label="申请内容" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="toNo" label="申请类型" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="content" label="申请内容" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="knowledgeApplyType" label="申请类型" show-overflow-tooltip>
+					<template #default="{ row }">
+						<span>
+							{{ row.knowledgeApplyType === 0 ? '新增' : '更新' }}
+						</span>
+					</template>
+				</el-table-column>
 				<el-table-column label="状态" show-overflow-tooltip>
-					<template #default="scope">
-						<el-button text type="primary">
-							{{ scope.row.toNo }}
-						</el-button>
+					<template #default="{ row }">
+						<span style="color: var(--el-color-primary)" v-if="row.status === 0">处理中</span>
+						<span style="color: var(--el-color-success)" v-if="row.status === 1">处理完成</span>
+						<span style="color: var(--el-color-danger)" v-if="row.status === 2">已退回</span>
+						<span style="color: var(--el-color-info)" v-if="row.status === 3">已撤销</span>
 					</template>
 				</el-table-column>
-
 				<el-table-column prop="toNo" label="创建时间" show-overflow-tooltip width="170">
 					<template #default="scope">
 						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
@@ -70,27 +76,30 @@
 				</el-table-column>
 				<el-table-column prop="toNo" label="处理完成时间" show-overflow-tooltip width="170">
 					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						<span>{{ formatDate(scope.row.handleTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="toNo" label="撤回时间" show-overflow-tooltip width="170">
+					<template #default="scope">
+						<span>{{ formatDate(scope.row.revokeTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="退回时间" show-overflow-tooltip width="170">
 					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						<span>{{ formatDate(scope.row.returnTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column label="是否超时" show-overflow-tooltip>
-					<template #default="scope">
-						<el-button text type="primary">
-							{{ scope.row.toNo }}
-						</el-button>
+					<template #default="{ row }">
+						{{ row.isOvertime ? '是' : '否' }}
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="120" fixed="right" align="center">
-					<template #default="scope">
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="查看详情"> 查看详情 </el-button>
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="编辑"> 编辑 </el-button>
-						<el-button text type="danger" @click="onPalySoundRecording(scope.row)" title="撤回"> </el-button>
-						<el-button text type="danger" @click="onPalySoundRecording(scope.row)" title="删除"> 删除 </el-button>
+				<el-table-column label="操作" width="200" fixed="right" align="center">
+					<template #default="{ row }">
+						<el-button text type="primary" @click="onDetail(row)" title="查看详情" v-if="[0, 1, 2].includes(row.status)"> 查看详情 </el-button>
+						<el-button text type="primary" @click="onEdit(row)" title="编辑" v-if="[2, 3].includes(row.status)"> 编辑 </el-button>
+						<el-button text type="danger" @click="onRecall(row)" title="撤回" v-if="[0].includes(row.status)"> 撤回 </el-button>
+						<el-button text type="danger" @click="onDelete(row)" title="删除" v-if="[2, 3].includes(row.status)"> 删除 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -98,26 +107,32 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
-		<Apply ref="ApplyRef" @updateList="getList" />
+		<Add ref="AddRef" @updateList="getList" />
+		<Edit ref="EditRef" @updateList="getList" />
+		<Detail ref="DetailRef" />
 	</div>
 </template>
 
 <script lang="ts" setup name="MyknowledgeApply">
-import { ref, reactive, toRefs, onMounted, defineAsyncComponent } from 'vue';
+import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { ElMessage } from 'element-plus';
+import { ElMessage, ElMessageBox } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 // 引入节流
 import { throttle } from '/@/utils/tools';
-import { KnowledgeApply } from '/@/api/knowledge/apply';
+import { KnowledgeApply, KnowledgeRemove, KnowledgeCancel } from '/@/api/knowledge/apply';
+import { getOrgList } from '/@/api/system/organize';
+import { KnowledgeGetknowledge } from '/@/api/knowledge';
 
 // 引入组件
-const Apply = defineAsyncComponent(() => import('/@/views/knowledge/apply/my/component/Apply.vue'));
+const Add = defineAsyncComponent(() => import('/@/views/knowledge/apply/my/component/Add.vue'));
+const Edit = defineAsyncComponent(() => import('/@/views/knowledge/apply/my/component/Edit.vue'));
+const Detail = defineAsyncComponent(() => import('/@/views/knowledge/apply/my/component/Detail.vue'));
 const shortcuts = [
 	{
 		text: '近一周',
@@ -153,7 +168,7 @@ const state = reactive(<any>{
 	queryParams: {
 		PageIndex: 1,
 		PageSize: 10,
-		Status: '0',
+		Status: ' ',
 		ApplyType: '',
 		IsOvertime: '',
 		StartTime: '',
@@ -163,36 +178,37 @@ const state = reactive(<any>{
 	loading: false,
 	total: 0,
 	multipleSelection: [],
-	directionList: [
-		{
-			label: '全部',
-			value: '',
-		},
+	ApplyTypeOptions: [
 		{
-			label: '呼入',
+			label: '新增',
 			value: 0,
 		},
 		{
-			label: '呼出',
+			label: '修改',
 			value: 1,
 		},
 	],
+	orgData: [],
 });
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
-const { queryParams, tableList, loading, total, directionList } = toRefs(state);
 const ruleFormRef = ref<FormInstance>();
-const ApplyRef = ref();
+const AddRef = ref();
+const EditRef = ref();
+const DetailRef = ref();
 // 创建时间
 const tiemChange = (val: string[]) => {
-	state.queryParams.StartTime = val[0];
-	state.queryParams.EndTime = val[0];
+	if (val) {
+		state.queryParams.StartTime = val[0];
+		state.queryParams.EndTime = val[0];
+	}
 };
 /** 获取用户列表 */
 const getList = () => {
-	queryParams.value.PageIndex = 1;
 	state.loading = true;
-	KnowledgeApply(queryParams.value)
+	let request = JSON.parse(JSON.stringify(state.queryParams));
+	Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
+	KnowledgeApply(request)
 		.then((response: any) => {
 			state.tableList = response?.result.items ?? [];
 			state.total = response?.result.total;
@@ -210,17 +226,61 @@ const handleSelectionChange = (val: any) => {
 const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
+	state.queryParams.PageIndex = 1;
+	state.queryParams.StartTime = '';
+	state.queryParams.EndTime = '';
 	getList();
 }, 1000);
 // 切换tab 查询列表
 const handleClick = () => {
-	getList();
+	resetQuery();
+};
+// 查看详情
+const onDetail = (row: any) => {
+	DetailRef.value.openDialog(row);
 };
 // 发起申请
 const onApply = () => {
-	ApplyRef.value.openDialog();
+	AddRef.value.openDialog(state.orgData,state.knowledgeOptions);
+};
+// 修改申请
+const onEdit = (row: any) => {
+	EditRef.value.openDialog(row, state.orgData,state.knowledgeOptions);
+};
+// 撤回
+const onRecall = (row: any) => {
+	ElMessageBox.confirm(`是否确定要撤回申请?撤回后请到【主动撤回】中进行查看和管理`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			KnowledgeCancel(row.id).then(() => {
+				ElMessage.success('操作成功');
+				getList();
+			});
+		})
+		.catch(() => {});
+};
+// 删除
+const onDelete = (row: any) => {
+	ElMessageBox.confirm(`是否确定删除该申请?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			KnowledgeRemove(row.id).then(() => {
+				ElMessage.success('操作成功');
+				getList();
+			});
+		})
+		.catch(() => {});
 };
-const onPalySoundRecording = (row: any) => {};
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
@@ -240,8 +300,14 @@ const onImportTable = () => {
 	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
 };
 
-onMounted(() => {
+onMounted(async () => {
 	getList();
+	try {
+		const res: any = await Promise.all([getOrgList(), KnowledgeGetknowledge({ PageIndex: 1, PageSize: 99 })]);
+		state.orgData = res[0].result ?? [];
+		state.knowledgeOptions = res[1].result?.items ?? [];
+	} catch (error) {
+		console.log(error);
+	}
 });
 </script>
-<style lang="scss" scoped></style>

+ 68 - 0
src/views/knowledge/component/Preview.vue

@@ -0,0 +1,68 @@
+<template>
+	<div class="knowledge-knowledge-Standard-container">
+		<el-dialog title="预览" v-model="state.isShowDialog" draggable width="70%">
+			<el-row :gutter="35" v-loading="state.loading">
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb30">
+					<h1 class="font18">{{ state.info.title }}</h1></el-col
+				>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb10"> 类别:{{ state.info.knowledgeTypeName }}</el-col>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb10"> 热点:{{ state.info.hotspotName }}</el-col>
+				<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8" class="mb10" v-if="state.info.keywords"> 关键词:{{ state.info.keywords }}</el-col>
+				<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8" class="mb10"> 是否公开:{{ state.info.isPublic ? '是' : '否' }}</el-col>
+				<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8" class="mb10"> 创建人:{{ state.info.creatorName }}</el-col>
+				<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8" class="mb10">
+					创建时间:{{ formatDate(state.info.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</el-col
+				>
+				<div style="border-bottom: var(--el-border); height: 1px" class="w100 mt10"></div>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb10 mt30" v-if="state.info.summary"> 摘要:{{ state.info.summary }}</el-col>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mt20"> <div v-html="state.info.content"></div></el-col>
+			</el-row>
+			<div></div>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="state.isShowDialog = false" class="default-button">关 闭</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup lang="ts" name="knowledgePreview">
+import { reactive } from 'vue';
+import { KnowledgeInfo } from '/@/api/knowledge';
+import { formatDate } from '/@/utils/formatTime';
+
+// 定义变量内容
+const state = reactive<any>({
+	isShowDialog: false,
+	info: {},
+});
+// 打开弹窗
+const openDialog = async (row: any, isDraft: boolean = false) => {
+	state.isShowDialog = true;
+	state.loading = true;
+	if (isDraft) {
+		state.info = row;
+		state.loading = false;
+	} else {
+		try {
+			const res: any = await KnowledgeInfo(row.id);
+			state.info = res.result ?? {};
+			state.isShowDialog = true;
+			state.loading = false;
+		} catch (error) {
+			state.loading = false;
+		}
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.isShowDialog = false;
+};
+// 查询知识详情
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 495 - 0
src/views/knowledge/component/Process.vue

@@ -0,0 +1,495 @@
+<template>
+	<div>
+		<el-dialog
+			v-model="state.isShowDialog"
+			draggable
+			:title="state.title + '流程'"
+			ref="dialogRef"
+			@mouseup="mouseup"
+			:style="'transform: ' + state.trasform + ';'"
+			append-to-body
+		>
+			<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
+								<el-option v-for="item in state.nextStepOptions" :key="item.code" :label="item.name" :value="item.code" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<!-- 撤回 -->
+					<template v-if="state.processType === 'recall'">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="处理人" prop="nextHandlers" :rules="[{ required: false, message: '请选择处理人', trigger: 'change' }]">
+								<el-select
+									v-model="state.ruleForm.nextHandlers"
+									multiple
+									filterable
+									placeholder="请选择处理人"
+									class="w100"
+									@change="selectHandersRecall"
+									value-key="key"
+									clearable
+								>
+									<el-option v-for="item in state.handlerClassifies" :key="item.id" :label="item.name" :value="item" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item
+								label="主办"
+								prop="nextMainHandler"
+								filterable
+								clearable
+								:rules="[{ required: false, message: '请选择主办', trigger: 'change' }]"
+							>
+								<el-select v-model="state.ruleForm.nextMainHandler" placeholder="请选择主办" class="w100">
+									<el-option v-for="item in state.handerMainOptions" :key="item.id" :label="item.name" :value="item.id" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+					</template>
+					<!-- 其他 -->
+					<template v-else>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="处理人" prop="nextHandlers" :rules="[{ required: false, message: '请选择处理人', trigger: 'change' }]">
+								<el-select
+									v-model="state.ruleForm.nextHandlers"
+									multiple
+									filterable
+									placeholder="请选择处理人"
+									class="w100"
+									@change="selectHanders"
+									value-key="key"
+									clearable
+								>
+									<el-option v-for="item in state.handerOptions" :key="item.key" :label="item.value" :value="item" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item
+								label="主办"
+								prop="nextMainHandler"
+								filterable
+								clearable
+								:rules="[{ required: false, message: '请选择主办', trigger: 'change' }]"
+							>
+								<el-select v-model="state.ruleForm.nextMainHandler" placeholder="请选择主办" class="w100">
+									<el-option v-for="item in state.handerMainOptions" :key="item.key" :label="item.value" :value="item.key" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="8" :lg="12" :xl="12">
+							<el-form-item label="" prop="acceptSms">
+								<el-checkbox v-model="state.ruleForm.acceptSms" label="短信通知" />
+							</el-form-item>
+						</el-col>
+					</template>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item
+							:label="state.title + '意见'"
+							class="textarea"
+							prop="opinion"
+							:rules="[{ required: true, message: '请填写常用意见', trigger: 'blur' }]"
+						>
+							<el-input
+								v-model="state.ruleForm.opinion"
+								type="textarea"
+								:autosize="{ minRows: 10, maxRows: 10 }"
+								placeholder="请填写常用意见"
+								clearable
+								max-length="2000"
+							>
+							</el-input>
+							<span class="bttons">
+								<el-button @click="showComents" class="default-button" :loading="state.loading">常用意见</el-button>
+								<el-button type="primary" @click="onAddComments" :loading="state.loading">添加到常用意见</el-button>
+							</span>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="附件" prop="additions" :rules="[{ required: false, message: '请填写诉求内容', trigger: 'change' }]">
+							<el-upload
+								v-model:file-list="state.fileList"
+								class="upload-demo w100"
+								action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
+								multiple
+								:before-remove="beforeRemove"
+								:on-exceed="handleExceed"
+								ref="uploadListRef"
+							>
+								<el-button> <SvgIcon name="ele-Upload" /> 上传附件 </el-button>
+								<template #file="{ file }">
+									<div class="el-upload-list__item-info">
+										<a class="el-upload-list__item-name">
+											<SvgIcon class="mr5" :name="fileType(checkFile(file.name))" size="16px" />
+											<span class="el-upload-list__item-file-name">{{ file.name }}</span>
+										</a>
+									</div>
+									<SvgIcon name="ele-Close" class="el-icon--close" size="14px" title="删除文件" @click="handleRemove(file)" />
+								</template>
+							</el-upload>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" class="default-button">取 消</el-button>
+					<!-- <el-button type="primary" @click="onSave" :loading="loading">保 存</el-button> -->
+					<el-button type="primary" @click="onSubmit" :loading="state.loading">提 交</el-button>
+				</span>
+			</template>
+			<!-- 常用意见管理 -->
+			<Comment ref="CommentRef" @chooseComment="chooseComment" />
+		</el-dialog>
+	</div>
+</template>
+
+<script setup lang="ts" name="KonwledgeProcess">
+import { defineAsyncComponent, reactive, ref, computed } from 'vue';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import type { UploadProps } from 'element-plus';
+import { checkFile, fileType } from '/@/utils/tools';
+import { addCommon } from '/@/api/business/commonP';
+import {
+	KnowledgeAddStartflowParams,
+	KnowledgeUpdateStartflowParams,
+	KnowledgeDeleteStartflowParams,
+	KnowledgeAddStartflow,
+	KnowledgeUpdateStartflow,
+	KnowledgeDeleteStartflow,
+} from '/@/api/knowledge';
+import { workflowNextsteps, workflowNext, workflowRecall, workflowJump } from '/@/api/system/workflow';
+
+// 引入组件
+const Comment = defineAsyncComponent(() => import('/@/views/business/order/components/Comment.vue'));
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['onSubmitProcess']);
+// 定义变量内容
+const state = reactive<any>({
+	isShowDialog: false,
+	title: '提交',
+	ruleForm: {
+		nextStepCode: '',
+		nextHandlers: [],
+		nextMainHandler: '',
+		acceptSms: false,
+		opinion: '',
+	},
+	nextStepOptions: [], // 下一节点
+	handerOptions: [], // 处理人
+	trasform: 'translate(0px, 0px)',
+	fileList: [],
+	loading: false,
+	isStartFlow: false, //是否开启流程
+	processType: 'next',
+	workflowId: '', //流程id
+	commonEeum: '',
+	handlerClassifies: [], //撤回处理人
+	handerMainOptions: [], // 主办人
+});
+const ruleFormRef = ref();
+const CommentRef = ref();
+const dialogRef = ref();
+const uploadListRef = ref();
+// 打开弹窗
+const openDialog = async (val: any) => {
+	console.log(val);
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+	state.processType = val.processType ?? 'next'; // 流程状态
+	state.workflowId = val.id ?? ''; // 流程id
+	state.commonEeum = val.commonEeum ?? ''; // 常用意见类型
+	state.title = val.title ?? '提交流程'; // 流程标题
+	let res: any = {};
+	switch (state.processType) {
+		case 'addStart':
+			res = await KnowledgeAddStartflowParams(); //获取新增开启流程参数
+			state.nextStepOptions = res.result;
+			if (state.nextStepOptions.length === 1) {
+				state.ruleForm.nextStepCode = state.nextStepOptions[0].code;
+				state.handerOptions = state.nextStepOptions[0].nextSteps;
+			}
+			break;
+		case 'editStart':
+			res = await KnowledgeUpdateStartflowParams(); //获取修改开启流程参数
+			state.nextStepOptions = res.result;
+			if (state.nextStepOptions.length === 1) {
+				state.ruleForm.nextStepCode = state.nextStepOptions[0].code;
+				state.handerOptions = state.nextStepOptions[0].nextSteps;
+			}
+			break;
+		case 'deleteStart':
+			res = await KnowledgeDeleteStartflowParams(); //获取删除开启流程参数
+			state.nextStepOptions = res.result;
+			if (state.nextStepOptions.length === 1) {
+				state.ruleForm.nextStepCode = state.nextStepOptions[0].code;
+				state.handerOptions = state.nextStepOptions[0].nextSteps;
+			}
+			break;
+		case 'recall': // 撤回流程
+			res = await workflowRecall(state.workflowId); //撤回参数
+			state.nextStepOptions = res.result;
+			state.ruleForm.workflowId = state.workflowId;
+			if (state.nextStepOptions.length === 1) {
+				state.ruleForm.nextStepCode = state.nextStepOptions[0].code;
+				state.handlerClassifies = state.nextStepOptions[0].handlerClassifies;
+			}
+			break;
+		case 'return': // 退回流程
+			break;
+		case 'next': // 默认下一流程
+			res = await workflowNextsteps(state.workflowId);
+			state.ruleForm.workflowId = state.workflowId;
+			state.nextStepOptions = res.result;
+			if (state.nextStepOptions.length === 1) {
+				state.ruleForm.nextStepCode = state.nextStepOptions[0].code;
+				state.handerOptions = state.nextStepOptions[0].nextSteps;
+			}
+			break;
+
+		default: // 默认下一流程
+			res = await workflowNextsteps(state.workflowId);
+			state.ruleForm.workflowId = state.workflowId;
+			state.nextStepOptions = res.result;
+			if (state.nextStepOptions.length === 1) {
+				state.ruleForm.nextStepCode = state.nextStepOptions[0].code;
+				state.handerOptions = state.nextStepOptions[0].nextSteps;
+			}
+			break;
+	}
+	state.isShowDialog = true;
+};
+// 流程选择下一环节
+const selectNextStep = (val: any) => {
+	ruleFormRef.value?.resetFields('nextHandlers');
+	ruleFormRef.value?.resetFields('nextMainHandler');
+	let next: any;
+	switch (state.processType) {
+		case 'addStart' || 'editStart' || 'deleteStart':
+			next = state.nextStepOptions.find((item: any) => item.code === val);
+			state.handerOptions = next.nextSteps ?? [];
+			break;
+		case 'recall': // 撤回
+			next = state.nextStepOptions.find((item: any) => item.code === val);
+			console.log(next, state.nextStepOptions);
+			state.handlerClassifies = next.handlerClassifies ?? [];
+			break;
+		default:
+			next = state.nextStepOptions.find((item: any) => item.code === val);
+			state.handerOptions = next.nextSteps ?? [];
+			break;
+	}
+};
+// 选择处理人
+const selectHanders = () => {
+	ruleFormRef.value?.resetFields('nextMainHandler');
+};
+// 选择处理人撤回
+const selectHandersRecall = () => {
+	ruleFormRef.value?.resetFields('nextMainHandler');
+};
+// 主办从处理人中选择
+state.handerMainOptions = computed(() => {
+	return state.ruleForm.nextHandlers;
+});
+// 设置抽屉
+const mouseup = () => {
+	state.trasform = dialogRef.value.dialogContentRef.$el.style.transform;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.isShowDialog = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+// 删除确认
+const beforeRemove: UploadProps['beforeRemove'] = (uploadFile) => {
+	return ElMessageBox.confirm(`确定要删除 ${uploadFile.name} ?`).then(
+		() => true,
+		() => false
+	);
+};
+// 删除文件
+const handleRemove = (file: any) => {
+	uploadListRef.value.handleRemove(file);
+};
+const handleExceed: UploadProps['onExceed'] = (files, uploadFiles) => {
+	ElMessage.warning(`The limit is 3, you selected ${files.length} files this time, add up to ${files.length + uploadFiles.length} totally`);
+};
+// 打开常用意见管理
+const showComents = () => {
+	CommentRef.value.openDialog(state.commonEeum);
+};
+// 添加到常用意见
+const onAddComments = async () => {
+	if (!state.ruleForm.opinion) {
+		ElMessage.warning(`请先填写${state.title}意见`);
+		return;
+	}
+	await addCommon({
+		typeCode: state.commonEeum,
+		content: state.ruleForm.opinion,
+	});
+	ElMessage.success('操作成功');
+	CommentRef.value.closeDialog();
+};
+// 选择常用意见 填入填写框
+const chooseComment = (item: any) => {
+	state.ruleForm.opinion += item.content;
+	CommentRef.value.closeDialog();
+};
+// 保存
+// const onSave = () => {
+// 	ruleFormRef.value.validate((valid: boolean) => {
+// 		if (valid) {
+// 			loading.value = true;
+// 			emit('onSubmit');
+// 		} else {
+// 			return false;
+// 		}
+// 	});
+// };
+// 提交
+const onSubmit = () => {
+	ruleFormRef.value.validate((valid: boolean) => {
+		if (valid) {
+			ElMessageBox.confirm(`确认提交?`, '提示', {
+				confirmButtonText: '确认',
+				cancelButtonText: '取消',
+				type: 'warning',
+				draggable: true,
+				cancelButtonClass: 'default-button',
+				autofocus: false,
+			})
+				.then(() => {
+					state.loading = true;
+					let submitObj = JSON.parse(JSON.stringify(state.ruleForm));
+					submitObj.nextHandlers = submitObj.nextHandlers.map((item: any) => {
+						return {
+							id: item.key,
+							name: item.value,
+						};
+					});
+					switch (state.processType) {
+						case 'addStart': //开始新增流程
+						KnowledgeAddStartflow(state.workflowId, submitObj)
+								.then(() => {
+									ElMessage.success('操作成功');
+									state.loading = false;
+									state.isShowDialog = false;
+									emit('onSubmitProcess');
+								})
+								.catch(() => {
+									state.loading = false;
+									state.isShowDialog = false;
+								});
+							break;
+						case 'editStart': //开始更新流程
+						KnowledgeUpdateStartflow(state.workflowId, submitObj)
+								.then(() => {
+									ElMessage.success('操作成功');
+									state.loading = false;
+									state.isShowDialog = false;
+									emit('onSubmitProcess');
+								})
+								.catch(() => {
+									state.loading = false;
+									state.isShowDialog = false;
+								});
+							break;
+						case 'deleteStart': //开始删除流程
+						KnowledgeDeleteStartflow(state.workflowId, submitObj)
+								.then(() => {
+									ElMessage.success('操作成功');
+									state.loading = false;
+									state.isShowDialog = false;
+									emit('onSubmitProcess');
+								})
+								.catch(() => {
+									state.loading = false;
+									state.isShowDialog = false;
+								});
+							break;
+						case 'recall': // 撤回流程
+							workflowJump(submitObj)
+								.then(() => {
+									ElMessage.success('操作成功');
+									state.loading = false;
+									state.isShowDialog = false;
+									emit('onSubmitProcess');
+								})
+								.catch(() => {
+									state.loading = false;
+									state.isShowDialog = false;
+								});
+							break;
+						case 'return': // 退回流程
+							break;
+						case 'next': // 默认下一流程
+							workflowNext(submitObj)
+								.then(() => {
+									ElMessage.success('操作成功');
+									state.loading = false;
+									state.isShowDialog = false;
+									emit('onSubmitProcess');
+								})
+								.catch(() => {
+									state.loading = false;
+									state.isShowDialog = false;
+								});
+							break;
+
+						default: // 默认下一流程
+							workflowNext(submitObj)
+								.then(() => {
+									ElMessage.success('操作成功');
+									state.loading = false;
+									state.isShowDialog = false;
+									emit('onSubmitProcess');
+								})
+								.catch(() => {
+									state.loading = false;
+									state.isShowDialog = false;
+								});
+							break;
+					}
+				})
+				.catch(() => {});
+		} else {
+			return false;
+		}
+	});
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>
+<style lang="scss" scoped>
+.upload-demo {
+	:deep(.el-upload-list) {
+		display: flex;
+		flex-wrap: wrap;
+		.el-upload-list__item {
+			width: calc(25% - 10px);
+			border: var(--el-border);
+			margin-right: 10px;
+		}
+	}
+}
+.textarea {
+	position: relative;
+	.bttons {
+		position: absolute;
+		right: 10px;
+		bottom: 10px;
+	}
+}
+</style>

+ 58 - 0
src/views/knowledge/component/ProcessRecord.vue

@@ -0,0 +1,58 @@
+<template>
+	<div class="knowledge-knowledge-ProcessRecord-container">
+		<el-dialog title="审核记录" v-model="state.isShowDialog" draggable>
+			<el-table :data="state.tableData">
+				<el-table-column prop="date" label="审核人" width="180" />
+				<el-table-column prop="name" label="审核状态" width="180" />
+				<el-table-column prop="name" label="审核时间" width="180">
+                    <template #default="{row}">
+                        {{ formatDate(row.creationTime,'YYYY-mm-dd HH:MM:SS') }}
+                    </template>
+                </el-table-column>
+				<el-table-column prop="address" label="备注" />
+			</el-table>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="state.isShowDialog = false" class="default-button">关 闭</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup lang="ts" name="knowledgeProcessRecord">
+import { reactive } from 'vue';
+import { formatDate } from '/@/utils/formatTime';
+import { KnowledgeGetworkflow } from '/@/api/knowledge';
+
+// 定义变量内容
+const state = reactive<any>({
+	isShowDialog: false,
+    tableData:[]
+});
+// 打开弹窗
+const openDialog = (row: any) => {
+	KnowledgeGetworkflowFn(row.workflowId);
+	state.isShowDialog = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.isShowDialog = false;
+};
+// 查询规范详情
+const KnowledgeGetworkflowFn = async (id: string) => {
+	try {
+		state.loading = true;
+		const res: any = await KnowledgeGetworkflow(id);
+		state.tableData = res.result?.traces ?? [];
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 5 - 4
src/views/knowledge/config/standard/index.vue

@@ -1,6 +1,6 @@
 <template>
-	<div class="knowledge-standard-container layout-padding">
-		<div class="layout-padding-auto layout-padding-view pd15">
+	<div class="knowledge-standard-container layout-pd">
+		<el-card shadow="never">
 			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="80px">
 				<el-form-item label="标题" prop="title" :rules="[{ required: true, message: '输入标题,不超过30个字', trigger: 'blur' }]">
 					<el-input v-model="state.ruleForm.title" placeholder="输入标题,不超过30个字" clearable max-length="30"></el-input>
@@ -13,7 +13,7 @@
 					<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading"> 发 布</el-button>
 				</el-form-item>
 			</el-form>
-		</div>
+		</el-card>
 		<el-dialog title="预览" v-model="state.isShowDialog" draggable>
 			<div>
 				<h3 style="text-align: center">{{ state.ruleForm.title }}</h3>
@@ -34,6 +34,7 @@ import { ElMessage, FormInstance, ElMessageBox } from 'element-plus';
 import { useRoute } from 'vue-router';
 import { standardInfo, standardUpdate } from '/@/api/knowledge/standard';
 import mittBus from '/@/utils/mitt';
+import '@wangeditor/editor/dist/css/style.css'; // 引入 css
 
 // 引入组件
 const Editor = defineAsyncComponent(() => import('/@/components/Editor/index.vue'));
@@ -57,7 +58,7 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
 	await formEl.validate((valid) => {
 		if (valid) {
 			ElMessageBox.confirm(`是否要发布?`, '提示', {
-				confirmButtonText: '删除',
+				confirmButtonText: '确定',
 				cancelButtonText: '取消',
 				type: 'warning',
 			})

+ 9 - 6
src/views/knowledge/config/type/index.vue

@@ -19,19 +19,22 @@
 			<!-- 表格 -->
 			<el-table class="table" :data="state.tableData" row-key="id" default-expand-all v-loading="state.loading" :tree-props="{ children: 'child' }" ref="tableRef">
 				<el-table-column prop="name" label="类型名称" />
-				<el-table-column prop="isEnable" label="状态" width="150">
+				<el-table-column prop="isEnable" label="状态" width="150" align="center">
 					<template #default="{ row }">
-						<span v-if="row.isEnable" style="color: var(--el-color-success)">启用</span>
-						<span v-else style="color: var(--el-color-danger)">停用</span>
+						<el-tag v-if="row.isEnable" type="success">
+							启用
+						</el-tag>
+						<el-tag v-else type="info">
+							停用
+						</el-tag>
 					</template>
 				</el-table-column>
 				<el-table-column label="操作" width="300" fixed="right" align="center">
-					<!-- 草稿0 status 可以删除 -->
 					<template #default="{ row }">
 						<el-button text type="primary" @click="onOpenEdit(row)" title="修改"> 修改 </el-button>
-						<el-button text type="success" @click="onDisabled(row)" v-if="row.isEnable" title="停用"> 停用 </el-button>
+						<el-button text type="info" @click="onDisabled(row)" v-if="row.isEnable" title="停用"> 停用 </el-button>
 						<el-button text type="warning" @click="onEnable(row)" v-else title="启用"> 启用 </el-button>
-						<el-button text type="warning" @click="undercarriage(row)" v-if="row.isEnable" title="停用并下架关联知识"> 停用并下架 </el-button>
+						<el-button text type="info" @click="undercarriage(row)" v-if="row.isEnable" title="停用并下架关联知识"> 停用并下架 </el-button>
 						<el-button text type="danger" @click="onDelete(row)" title="删除"> 删除 </el-button>
 					</template>
 				</el-table-column>

+ 2 - 2
src/views/knowledge/knowledge/component/standard.vue → src/views/knowledge/knowledge/component/StandardInfo.vue

@@ -1,5 +1,5 @@
 <template>
-	<div class="knowledge-knowledge-add-container">
+	<div class="knowledge-knowledge-Standard-container">
 		<el-dialog title="知识编写规范" v-model="state.isShowDialog" draggable>
 			<div>
 				<h3 style="text-align: center">{{ state.info.title }}</h3>
@@ -14,7 +14,7 @@
 	</div>
 </template>
 
-<script setup lang="ts" name="knowledgeAddType">
+<script setup lang="ts" name="knowledgeStandardInfo">
 import { reactive } from 'vue';
 import { standardInfo } from '/@/api/knowledge/standard';
 

+ 128 - 84
src/views/knowledge/knowledge/component/add.vue

@@ -1,7 +1,7 @@
 <template>
-	<div class="knowledge-knowledge-add-container">
-		<el-dialog title="创建知识" v-model="state.isShowDialog" draggable>
-			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
+	<div class="knowledge-knowledge-add-container layout-pd">
+		<el-card shadow="never" style="padding: 0 50px">
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="120px" scroll-to-error>
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="温馨提示">
@@ -13,10 +13,10 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="知识分类" prop="knowledgeTypeId" :rules="[{ required: true, message: '请选择知识分类', trigger: 'change' }]">
 							<el-cascader
-								:options="state.treeData"
+								:options="state.typeData"
 								filterable
 								:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, children: 'child' }"
-								placeholder="请选择知识分类"
+								placeholder="请选择知识分类"
 								clearable
 								class="w100"
 								v-model="state.ruleForm.knowledgeTypeId"
@@ -77,25 +77,17 @@
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === '2'">
-						<el-form-item label="关联知识申请" prop="applies" :rules="[{ required: true, message: '请选择关联知识申请', trigger: 'change' }]">
-							<el-select v-model="state.ruleForm.applies" value-key="dicDataValue" clearable filterable placeholder="请选择关联知识申请" class="w100">
-								<el-option v-for="item in state.identityTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="关联知识申请" prop="applies" :rules="[{ required: false, message: '请选择关联知识申请', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.applies" value-key="id" clearable filterable placeholder="请选择关联知识申请" class="w100">
+								<el-option v-for="item in state.knowledgeApplyOptions" :key="item.id" :label="item.content" :value="item.id" />
 							</el-select>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.knowledgeApplyType === '2'">
-						<el-form-item label="关联知识" prop="code" :rules="[{ required: true, message: '请选择关联知识', trigger: 'change' }]">
-							<el-select
-								v-model="state.ruleForm.code"
-								multiple
-								value-key="dicDataValue"
-								clearable
-								filterable
-								placeholder="请选择关联知识"
-								class="w100"
-							>
-								<el-option v-for="item in state.identityTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="关联知识" prop="knowledges" :rules="[{ required: false, message: '请选择关联知识', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.knowledges" multiple value-key="id" clearable filterable placeholder="请选择关联知识" class="w100">
+								<el-option v-for="item in state.knowledgeOptions" :key="item.id" :label="item.title" :value="item.id" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -103,14 +95,20 @@
 						<el-form-item label="失效时间" prop="expiredTime" :rules="[{ required: false, message: '请选择失效时间', trigger: 'change' }]">
 							<template #label>
 								<div style="height: 34px; display: flex; align-items: center">
+									失效时间
 									<el-tooltip>
-										<SvgIcon name="ele-QuestionFilled" size="18px" class="mr3" />
+										<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
 										<template #content> 不设置则代表永久有效;到达预设失效时间,知识将自动下架 </template>
 									</el-tooltip>
-									失效时间
 								</div>
 							</template>
-							<el-date-picker v-model="state.ruleForm.expiredTime" type="date" placeholder="请选择失效时间" class="w100" />
+							<el-date-picker
+								v-model="state.ruleForm.expiredTime"
+								type="date"
+								placeholder="请选择失效时间"
+								class="w100"
+								value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
+							/>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
@@ -137,35 +135,63 @@
 							</el-upload>
 						</el-form-item>
 					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item>
+							<el-button type="primary" @click="onSubmitReview(ruleFormRef)" :loading="state.loading">提交审核</el-button>
+							<el-button class="default-button" @click="onPreview" :loading="state.loading">预览 </el-button>
+							<el-button @click="onSaveOnly(ruleFormRef)" class="default-button" :loading="state.loading">保存到草稿箱</el-button>
+						</el-form-item>
+					</el-col>
 				</el-row>
 			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">提交审核</el-button>
-					<el-button class="default-button" @click="onSubmit(ruleFormRef)" :loading="state.loading">预览 </el-button>
-					<el-button @click="onCancel" class="default-button" :loading="state.loading">保存到草稿箱</el-button>
-				</span>
-			</template>
-		</el-dialog>
-        <Standard ref="standardRef"/>
+		</el-card>
+		<!-- 编写规范 -->
+		<Standard ref="standardRef" />
+		<!-- 流程组件 -->
+		<Process ref="processRef" @onSubmitProcess="onSubmitProcess" />
+		<!-- 预览 -->
+		<Preview ref="previewRef" />
 	</div>
 </template>
 
-<script setup lang="ts" name="knowledgeAddType">
-import { reactive, ref, defineAsyncComponent } from 'vue';
-import { ElMessage,ElMessageBox } from 'element-plus';
+<script setup lang="ts" name="knowledgeAdd">
+import { reactive, ref, defineAsyncComponent, onMounted } from 'vue';
+import { ElMessage, ElMessageBox } from 'element-plus';
 import type { UploadProps, UploadUserFile, FormInstance } from 'element-plus';
-import { addType } from '/@/api/knowledge/type';
+import mittBus from '/@/utils/mitt';
+import { useRoute, useRouter } from 'vue-router';
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
 import { hotspottype } from '/@/api/business/order';
-import { checkFile, fileType } from '/@/utils/tools';
+import { checkFile, fileType, commonEeum } from '/@/utils/tools';
+import { treelist } from '/@/api/knowledge/type';
+import { KnowledgeGetknowledge, KnowledgeAddapply, KnowledgeAdd } from '/@/api/knowledge';
+import { adddrafts } from '/@/api/knowledge/draft';
 
 // 引入组件
 const Editor = defineAsyncComponent(() => import('/@/components/Editor/index.vue'));
-const Standard = defineAsyncComponent(() => import('/@/views/knowledge/knowledge/component/standard.vue'));
-
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList']);
+const Standard = defineAsyncComponent(() => import('/@/views/knowledge/knowledge/component/StandardInfo.vue'));
+const Process = defineAsyncComponent(() => import('/@/views/knowledge/component/Process.vue'));
+const Preview = defineAsyncComponent(() => import('/@/views/knowledge/component/Preview.vue'));
 
+// 定义变量内容
+const ruleFormRef = ref<any>();
+const state = reactive<any>({
+	isShowDialog: false,
+	ruleForm: {
+		isPublic: true,
+	},
+	typeData: [], // 知识分类
+	loading: false,
+	knowledgeOptions: [], //关联知识
+	knowledgeApplyOptions: [], //关联知识申请
+});
+const route = useRoute();
+const router = useRouter();
+const processRef = ref();
+const previewRef = ref();
+const stores = useUserInfo();
+const { userInfos } = storeToRefs(stores);
 // 热点分类远程搜索
 const HotspotProps = {
 	label: 'hotSpotFullName',
@@ -184,6 +210,7 @@ const hotsoptChange = (val: any, e: any) => {
 	state.external = [];
 	state.hotspotExternal = getParentId(e, state.external);
 	state.ruleForm.hotspotSpliceName = val.hotSpotFullName;
+	state.ruleForm.hotspotName = val.hotSpotFullName;
 	state.ruleForm.hotspot = val.hotSpotName;
 };
 // 递归查找父级Id
@@ -194,43 +221,17 @@ const getParentId = (val: any, arr: string[]) => {
 	}
 	return arr;
 };
-// 定义变量内容
-const ruleFormRef = ref<any>();
-const state = reactive<any>({
-	isShowDialog: false,
-	ruleForm: {
-		name: '',
-		sort: 0,
-		parentId: '',
-	},
-	treeData: [], // 上级
-	loading: false,
-});
-// 打开弹窗
-const openDialog = (treeData: any) => {
-	state.treeData = treeData ?? [];
-	ruleFormRef.value?.clearValidate();
-	ruleFormRef.value?.resetFields();
-	state.isShowDialog = true;
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.isShowDialog = false;
-};
-// 取消
-const onCancel = () => {
-	closeDialog();
-};
 // 展示编写规范
 const standardRef = ref();
-const showStandard = ()=>{
-    standardRef.value.openDialog();
-}
+const showStandard = () => {
+	standardRef.value.openDialog();
+};
 const cascaderRef = ref();
 // 获取选择name值
 const getselKnowledgeList = () => {
 	let currentNode = cascaderRef.value.getCheckedNodes();
 	state.ruleForm.parentName = currentNode[0]?.label ?? '';
+	state.ruleForm.knowledgeTypeName = currentNode[0]?.text ?? '';
 };
 const uploadListRef = ref();
 const fileList = ref<UploadUserFile[]>([]);
@@ -249,25 +250,68 @@ const handleRemove = (file: any) => {
 const handleExceed: UploadProps['onExceed'] = (files, uploadFiles) => {
 	ElMessage.warning(`The limit is 3, you selected ${files.length} files this time, add up to ${files.length + uploadFiles.length} totally`);
 };
-// 新增
-const onSubmit = async (formEl: FormInstance | undefined) => {
+// 提交审核
+const onSubmitReview = async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
-	await formEl.validate((valid, fields) => {
+	await formEl.validate((valid) => {
 		if (valid) {
-			addType(state.ruleForm).then(() => {
-				emit('updateList');
-				closeDialog(); // 关闭弹窗
+			state.ruleForm.hotspotExternal = state.hotspotExternal.join(',');
+			KnowledgeAdd(state.ruleForm).then((res: any) => {
+				processRef.value.openDialog({ id: res.result, title: '创建知识', commonEeum: commonEeum.Seat, processType: 'addStart' });
+			});
+		}
+	});
+};
+// 流程提交成功
+const onSubmitProcess = () => {
+	router.push({
+		path: '/knowledge',
+	});
+	// 关闭当前 tagsView
+	mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
+};
+// 预览
+const onPreview = () => {
+	state.ruleForm.creatorName = userInfos.value?.name ?? '';
+	state.ruleForm.creationTime = new Date();
+	previewRef.value.openDialog(state.ruleForm,true); //编辑预览
+};
+// 保存到草稿箱
+const onSaveOnly = async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid) => {
+		if (valid) {
+			state.ruleForm.hotspotExternal = state.hotspotExternal.join(',');
+			adddrafts(state.ruleForm).then(() => {
 				ElMessage.success('操作成功');
+				router.push({
+					path: '/knowledge/knowledge/draft',
+				});
+				// 关闭当前 tagsView
+				mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
 			});
-		} else {
-			console.log('error submit!', fields);
 		}
 	});
 };
-// 暴露变量
-defineExpose({
-	openDialog,
-	closeDialog,
+// 知识分类
+const getKnowledgeType = async () => {
+	state.loading = true;
+	try {
+		const res: any = await Promise.all([
+			treelist(),
+			KnowledgeGetknowledge({ PageIndex: 1, PageSize: 99 }),
+			KnowledgeAddapply({ PageIndex: 1, PageSize: 99 }),
+		]);
+		state.typeData = res[0].result ?? [];
+		state.knowledgeOptions = res[1].result?.items ?? [];
+		state.knowledgeApplyOptions = res[2].result?.items ?? [];
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
+onMounted(() => {
+	getKnowledgeType();
 });
 </script>
 <style scoped lang="scss">

+ 304 - 52
src/views/knowledge/knowledge/component/edit.vue

@@ -1,23 +1,25 @@
 <template>
-	<div class="knowledge-knowledge-edit-container">
-		<el-dialog title="编辑知识" v-model="state.isShowDialog" width="500px" draggable>
-			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="80px">
+	<div class="knowledge-knowledge-edit-container layout-pd">
+		<el-card shadow="never" style="padding: 0 50px">
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="120px" scroll-to-error>
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<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 label="温馨提示">
+							<span style="color: var(--el-color-danger)">
+								发布知识前请仔细阅读 <el-link type="primary" @click="showStandard">【知识编写规范】</el-link>,以免知识无法通过审核,浪费您的时间!
+							</span>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="上级类型" prop="parentId" :rules="[{ required: true, message: '请选择上级类型', trigger: 'change' }]">
+						<el-form-item label="知识分类" prop="knowledgeTypeId" :rules="[{ required: true, message: '请选择知识分类', trigger: 'change' }]">
 							<el-cascader
-								:options="state.treeData"
+								:options="state.typeData"
 								filterable
-								:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false,children:'child' }"
-								placeholder="请选择上级类型"
+								:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, children: 'child' }"
+								placeholder="请选择上知识分类"
 								clearable
 								class="w100"
-								v-model="state.ruleForm.parentId"
+								v-model="state.ruleForm.knowledgeTypeId"
 								ref="cascaderRef"
 								@change="getselKnowledgeList"
 							>
@@ -29,29 +31,148 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="排序" prop="sort" :rules="[{ required: false, message: '请填写排序', trigger: 'blur' }]">
-							<el-input-number v-model="state.ruleForm.sort" :min="0" :precision="0" class="w100"  placeholder="请填写排序"/>
+						<el-form-item label="热点分类" prop="hotspotId" :rules="[{ required: true, message: '请选择热点分类', trigger: 'change' }]">
+							<el-tree-select
+								class="w100"
+								v-model="state.ruleForm.hotspotId"
+								filterable
+								placeholder="请选择热点分类"
+								:props="HotspotProps"
+								lazy
+								:load="load"
+								node-key="id"
+								check-strictly
+								:render-after-expand="false"
+								@node-click="hotsoptChange"
+								ref="hotspotRef"
+								:default-expanded-keys="state.hotspotExternal"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="标题" prop="title" :rules="[{ required: true, message: '请填写标题', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.title" placeholder=" 输入标题,不超过30个字" max-length="30" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="摘要" prop="summary" :rules="[{ required: false, message: '请填写摘要', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.summary" placeholder="输入摘要,不超过200个字" max-length="200" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="正文" prop="content" :rules="[{ required: true, message: '请输入正文内容', trigger: 'blur' }]">
+							<Editor v-model:get-html="state.ruleForm.content" :disable="state.disable" placeholder="请输入正文内容" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="关键词" prop="keywords" :rules="[{ required: false, message: '请填写关键词要', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.keywords" placeholder="请输入关键词,多个关键词用英文“,”分开" max-length="200" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="是否公开" prop="isPublic" :rules="[{ required: false, message: '请选择是否公开', trigger: 'change' }]">
+							<el-radio-group v-model="state.ruleForm.isPublic">
+								<el-radio :label="true">是</el-radio>
+								<el-radio :label="false">否</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="关联知识申请" prop="applies" :rules="[{ required: false, message: '请选择关联知识申请', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.applies" value-key="id" clearable filterable placeholder="请选择关联知识申请" class="w100">
+								<el-option v-for="item in state.knowledgeApplyOptions" :key="item.id" :label="item.content" :value="item.id" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="关联知识" prop="knowledges" :rules="[{ required: false, message: '请选择关联知识', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.knowledges" multiple value-key="id" clearable filterable placeholder="请选择关联知识" class="w100">
+								<el-option v-for="item in state.knowledgeOptions" :key="item.id" :label="item.title" :value="item.id" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="失效时间" prop="expiredTime" :rules="[{ required: false, message: '请选择失效时间', trigger: 'change' }]">
+							<template #label>
+								<div style="height: 34px; display: flex; align-items: center">
+									失效时间
+									<el-tooltip>
+										<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
+										<template #content> 不设置则代表永久有效;到达预设失效时间,知识将自动下架 </template>
+									</el-tooltip>
+								</div>
+							</template>
+							<el-date-picker
+								v-model="state.ruleForm.expiredTime"
+								type="date"
+								placeholder="请选择失效时间"
+								class="w100"
+								value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="附件" prop="additions" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
+							<el-upload
+								v-model:file-list="fileList"
+								class="upload-demo w100"
+								action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
+								multiple
+								:before-remove="beforeRemove"
+								:on-exceed="handleExceed"
+								ref="uploadListRef"
+							>
+								<el-button> <SvgIcon name="ele-Upload" /> 上传附件 </el-button>
+								<template #file="{ file }">
+									<div class="el-upload-list__item-info">
+										<a class="el-upload-list__item-name">
+											<SvgIcon class="mr5" :name="fileType(checkFile(file.name))" size="16px" />
+											<span class="el-upload-list__item-file-name">{{ file.name }}</span>
+										</a>
+									</div>
+									<SvgIcon name="ele-Close" class="el-icon--close" size="14px" title="删除文件" @click="handleRemove(file)" />
+								</template>
+							</el-upload>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item>
+							<el-button type="primary" @click="onSubmitReview(ruleFormRef)" :loading="state.loading">提交审核</el-button>
+							<el-button class="default-button" @click="onPreview" :loading="state.loading">预览 </el-button>
+							<el-button @click="onSaveOnly(ruleFormRef)" class="default-button" :loading="state.loading">保存到草稿箱</el-button>
 						</el-form-item>
 					</el-col>
 				</el-row>
 			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="onCancel" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
-				</span>
-			</template>
-		</el-dialog>
+		</el-card>
+		<!-- 编写规范 -->
+		<Standard ref="standardRef" />
+		<!-- 流程组件 -->
+		<Process ref="processRef" @onSubmitProcess="onSubmitProcess" />
+		<!-- 预览 -->
+		<Preview ref="previewRef" />
 	</div>
 </template>
 
-<script setup lang="ts" name="knowledgeAddType">
-import { reactive, ref } from 'vue';
-import { ElMessage, FormInstance } from 'element-plus';
-import {  addType } from '/@/api/knowledge/type';
+<script setup lang="ts" name="knowledgeEdit">
+import { reactive, ref, defineAsyncComponent, onMounted } from 'vue';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import type { UploadProps, UploadUserFile, FormInstance } from 'element-plus';
+import mittBus from '/@/utils/mitt';
+import { useRoute, useRouter } from 'vue-router';
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
+import { checkFile, fileType, commonEeum } from '/@/utils/tools';
+import { treelist } from '/@/api/knowledge/type';
+import { KnowledgeDetail, KnowledgeUpdate, KnowledgeGetknowledge, KnowledgeAddapply, KnowledgeAdd } from '/@/api/knowledge';
+import { updatedrafts, draftsinfo } from '/@/api/knowledge/draft';
+import { hotspottype } from '/@/api/business/order';
 
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList']);
+// 引入组件
+const Editor = defineAsyncComponent(() => import('/@/components/Editor/index.vue'));
+const Process = defineAsyncComponent(() => import('/@/views/knowledge/component/Process.vue'));
+const Standard = defineAsyncComponent(() => import('/@/views/knowledge/knowledge/component/StandardInfo.vue'));
+const Preview = defineAsyncComponent(() => import('/@/views/knowledge/component/Preview.vue'));
 
 // 定义变量内容
 const ruleFormRef = ref<any>();
@@ -59,51 +180,182 @@ const state = reactive<any>({
 	isShowDialog: false,
 	ruleForm: {
 		name: '',
-    sort:0,
-    parentId:'',
+		isPublic: true,
+		parentId: '',
 	},
-	treeData: [], // 上级
+	typeData: [], // 知识分类
 	loading: false,
+	hotspotExternal: [],
 });
-// 打开弹窗
-const openDialog = (treeData:any) => {
-  state.treeData = treeData ?? [];
-  ruleFormRef.value?.clearValidate();
-		ruleFormRef.value?.resetFields();
-		state.isShowDialog = true;
+const route = useRoute();
+const router = useRouter();
+const processRef = ref();
+const previewRef = ref();
+const stores = useUserInfo();
+const { userInfos } = storeToRefs(stores);
+// 热点分类远程搜索
+const HotspotProps = {
+	label: 'hotSpotFullName',
+	children: 'children',
+	isLeaf: 'isLeaf',
+};
+// 热点分类懒加载
+const load = async (node: any, resolve: any) => {
+	if (node.isLeaf) return resolve([]);
+	const res: any = await hotspottype({ id: node.data.id ? node.data.id : '' });
+	resolve(res.result);
 };
-// 关闭弹窗
-const closeDialog = () => {
-	state.isShowDialog = false;
+// 选择热点分类
+const hotsoptChange = (val: any, e: any) => {
+	state.hotspotExternal = [];
+	state.external = [];
+	state.hotspotExternal = getParentId(e, state.external);
+	state.ruleForm.hotspotSpliceName = val.hotSpotFullName;
+	state.ruleForm.hotspotName = val.hotSpotFullName;
+	state.ruleForm.hotspot = val.hotSpotName;
 };
-// 取消
-const onCancel = () => {
-	closeDialog();
+// 递归查找父级Id
+const getParentId = (val: any, arr: string[]) => {
+	if (val.data.parentId) {
+		arr.push(val.data.parentId);
+		getParentId(val.parent, arr);
+	}
+	return arr;
+};
+// 展示编写规范
+const standardRef = ref();
+const showStandard = () => {
+	standardRef.value.openDialog();
 };
 const cascaderRef = ref();
 // 获取选择name值
 const getselKnowledgeList = () => {
 	let currentNode = cascaderRef.value.getCheckedNodes();
 	state.ruleForm.parentName = currentNode[0]?.label ?? '';
+	state.ruleForm.knowledgeTypeName = currentNode[0]?.text ?? '';
+};
+const uploadListRef = ref();
+const fileList = ref<UploadUserFile[]>([]);
+// 删除确认
+const beforeRemove: UploadProps['beforeRemove'] = (uploadFile) => {
+	return ElMessageBox.confirm(`确定要删除 ${uploadFile.name} ?`).then(
+		() => true,
+		() => false
+	);
+};
+// 删除文件
+const handleRemove = (file: any) => {
+	uploadListRef.value.handleRemove(file);
+};
+
+const handleExceed: UploadProps['onExceed'] = (files, uploadFiles) => {
+	ElMessage.warning(`The limit is 3, you selected ${files.length} files this time, add up to ${files.length + uploadFiles.length} totally`);
+};
+// 提交审核
+const onSubmitReview = async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid) => {
+		if (valid) {
+			state.ruleForm.hotspotExternal = state.hotspotExternal.join(',');
+			if (route.params.tagsViewName === '编辑知识草稿' && state.ruleForm.workflowId === null) {
+				// 如果是草稿提交流程
+				KnowledgeAdd(state.ruleForm).then((res: any) => {
+					processRef.value.openDialog({ id: res.result, title: '创建知识', commonEeum: commonEeum.Seat, processType: 'addStart' });
+				});
+			} else {
+				//更新知识流程提交
+				KnowledgeUpdate(state.ruleForm).then(() => {
+					processRef.value.openDialog({ id: state.ruleForm.workflowId, title: '更新知识', commonEeum: commonEeum.Seat, processType: 'editStart' });
+				});
+			}
+		}
+	});
 };
-// 新增
-const onSubmit = async (formEl: FormInstance | undefined) => {
+// 流程提交成功
+const onSubmitProcess = () => {
+	router.push({
+		path: '/knowledge',
+	});
+	// 关闭当前 tagsView
+	mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
+};
+// 预览
+const onPreview = () => {
+	state.ruleForm.creatorName = userInfos.value?.name ?? '';
+	state.ruleForm.creationTime = new Date();
+	previewRef.value.openDialog(state.ruleForm, true); //编辑预览
+};
+// 保存到草稿箱
+const onSaveOnly = async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
-	await formEl.validate((valid, fields) => {
+	await formEl.validate((valid) => {
 		if (valid) {
-			addType(state.ruleForm).then(() => {
-				emit('updateList');
-				closeDialog(); // 关闭弹窗
+			state.ruleForm.hotspotExternal = state.hotspotExternal.join(',');
+			updatedrafts(state.ruleForm).then(() => {
 				ElMessage.success('操作成功');
+				router.push({
+					path: '/knowledge/knowledge/draft',
+				});
+				// 关闭当前 tagsView
+				mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
 			});
-		} else {
-			console.log('error submit!', fields);
 		}
 	});
 };
-// 暴露变量
-defineExpose({
-	openDialog,
-	closeDialog,
+// 知识分类
+const getKnowledgeType = async () => {
+	state.loading = true;
+	try {
+		const res: any = await Promise.all([
+			treelist(),
+			KnowledgeGetknowledge({ PageIndex: 1, PageSize: 99 }),
+			KnowledgeAddapply({ PageIndex: 1, PageSize: 99 }),
+		]);
+		state.typeData = res[0].result ?? [];
+		state.knowledgeOptions = res[1].result?.items ?? [];
+		state.knowledgeApplyOptions = res[2].result?.items ?? [];
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
+const getDetail = async () => {
+	state.loading = true;
+	try {
+		let res: any;
+		if (route.params.tagsViewName === '编辑知识草稿') {
+			// 查询草稿详情
+			res = await draftsinfo(route.params.id);
+		} else {
+			// 查询知识详情
+			res = await KnowledgeDetail(route.params.id);
+		}
+
+		state.ruleForm = res.result ?? {};
+		if (res.result.hotspotExternal) {
+			//热点分类默认展开
+			state.hotspotExternal = state.ruleForm.hotspotExternal.split(',');
+		}
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
+onMounted(() => {
+	getKnowledgeType();
+	getDetail();
 });
 </script>
+<style scoped lang="scss">
+.upload-demo {
+	:deep(.el-upload-list) {
+		display: flex;
+		flex-wrap: wrap;
+		.el-upload-list__item {
+			width: calc(25% - 10px);
+			border: var(--el-border);
+			margin-right: 10px;
+		}
+	}
+}
+</style>

+ 43 - 22
src/views/knowledge/knowledge/delApply/index.vue

@@ -1,34 +1,31 @@
 <template>
 	<div class="knowledge-knowledgeDelApply-container layout-pd">
 		<el-card shadow="never">
-			<el-tabs v-model="queryParams.Status" @tab-change="handleClick">
+			<el-tabs v-model="state.queryParams.Status" @tab-change="handleClick">
 				<el-tab-pane label="全部" name="0"></el-tab-pane>
 				<el-tab-pane label="审核中" name="1"></el-tab-pane>
 				<el-tab-pane label="审核通过" name="2"></el-tab-pane>
 				<el-tab-pane label="审核不通过" name="3"></el-tab-pane>
-				<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+				<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 					<el-form-item label="关键字" prop="Keyword">
-						<el-input v-model="queryParams.Keyword" placeholder="标题/创建人/创建部门" clearable> </el-input>
-					</el-form-item>
-					<el-form-item label="申请部门" prop="street">
-						<el-input v-model="queryParams.street" placeholder="请填写申请部门" clearable> </el-input>
+						<el-input v-model="state.queryParams.Keyword" placeholder="标题/创建人/创建部门/申请部门" @keyup.enter="getList" clearable style="width: 300px;"> </el-input>
 					</el-form-item>
 					<el-form-item label="申请时间" prop="crTime">
 						<el-date-picker
 							v-model="state.queryParams.crTime"
-							type="daterange"
+							type="datetimerange"
 							unlink-panels
 							range-separator="至"
 							start-placeholder="开始日期"
 							end-placeholder="结束日期"
 							:shortcuts="shortcuts"
-							format="YYYY-MM-DD"
 							@change="tiemChange"
+							value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 						/>
 						<!-- value-format="YYYY-MM-DD" -->
 					</el-form-item>
 					<el-form-item>
-						<el-button type="primary" @click="getList" :loading="loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+						<el-button type="primary" @click="getList" :loading="state.loading" v-waves> <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>
@@ -44,7 +41,7 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableList" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column prop="fromNo" label="标题" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="toNo" label="类型" show-overflow-tooltip></el-table-column>
@@ -52,8 +49,6 @@
 				<el-table-column prop="toNo" label="作者" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="toNo" label="创建部门" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="toNo" label="阅读次数" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="toNo" label="评价数" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="toNo" label="点赞数" show-overflow-tooltip></el-table-column>
 				<el-table-column label="状态" show-overflow-tooltip>
 					<template #default="scope">
 						<el-button text type="primary">
@@ -68,8 +63,8 @@
 				</el-table-column>
 				<el-table-column label="操作" width="120" fixed="right" align="center">
 					<template #default="scope">
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="查看审核记录"> 查看审核记录 </el-button>
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="撤回申请"> 撤回申请 </el-button>
+						<el-button text type="primary" @click="onRecord(scope.row)" title="查看审核记录"> 查看审核记录 </el-button>
+						<el-button text type="primary" @click="onRecall(scope.row)" title="撤回申请"> 撤回申请 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -77,22 +72,27 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
+		<!-- 审核记录 -->
+		<ProcessRecord ref="processRecordRef" />
 	</div>
 </template>
 
 <script lang="ts" setup name="knowledgeDelApply">
-import { ref, reactive, toRefs, onMounted } from 'vue';
+import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { ElMessage } from 'element-plus';
+import { ElMessage,ElMessageBox } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 // 引入节流
 import { throttle } from '/@/utils/tools';
-import { KnowledgeDeletelist } from '/@/api/knowledge';
+import { KnowledgeDeletelist,KnowledgeRevoke } from '/@/api/knowledge';
+
+// 引入组件
+const ProcessRecord = defineAsyncComponent(() => import('/@/views/knowledge/component/ProcessRecord.vue'));
 
 const shortcuts = [
 	{
@@ -156,8 +156,8 @@ const state = reactive(<any>{
 });
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
-const { queryParams, tableList, loading, total, directionList } = toRefs(state);
 const ruleFormRef = ref<FormInstance>();
+const processRecordRef = ref();
 // 创建时间
 const tiemChange = (val: string[]) => {
 	state.queryParams.StartTime = val[0];
@@ -165,9 +165,10 @@ const tiemChange = (val: string[]) => {
 };
 /** 获取知识库删除列表 */
 const getList = () => {
-	queryParams.value.PageIndex = 1;
 	state.loading = true;
-	KnowledgeDeletelist(queryParams.value)
+	let request = JSON.parse(JSON.stringify(state.queryParams));
+	Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
+	KnowledgeDeletelist(Reflect)
 		.then((response: any) => {
 			state.tableList = response?.result.items ?? [];
 			state.total = response?.result.total;
@@ -191,7 +192,27 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 const handleClick = () => {
 	getList();
 };
-const onPalySoundRecording = (row: any) => {};
+// 查看申请记录
+const onRecord = (row: any) => {
+	processRecordRef.value.openDialog(row);
+};
+// 撤回
+const onRecall = (row: any) => {
+	ElMessageBox.confirm(`是否确定要撤回申请?撤回后请到【主动撤回】中进行查看和管理`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			KnowledgeRevoke(row.id).then(() => {
+				ElMessage.success('操作成功');
+				getList();
+			});
+		})
+		.catch(() => {});
+};
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [

+ 78 - 27
src/views/knowledge/knowledge/draft/index.vue

@@ -1,31 +1,42 @@
 <template>
 	<div class="knowledge-knowledgeDraft-container layout-pd">
 		<el-card shadow="never">
-			<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+			<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 				<el-form-item label="标题" prop="street">
-					<el-input v-model="queryParams.street" placeholder="请填写标题" clearable> </el-input>
+					<el-input v-model="state.queryParams.street" placeholder="请填写标题" @keyup.enter="getList" clearable> </el-input>
 				</el-form-item>
-				<el-form-item label="类型" prop="ApplyType">
-					<el-select v-model="queryParams.ApplyType" placeholder="请选择类型" class="w100">
-						<el-option v-for="item in directionList" :key="item.value" :label="item.label" :value="item.value" />
-					</el-select>
+				<el-form-item label="类型" prop="KnowledgeTypeId">
+					<el-cascader
+						:options="state.typeData"
+						filterable
+						:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, children: 'child' }"
+						placeholder="请选择类型"
+						clearable
+						class="w100"
+						v-model="state.queryParams.KnowledgeTypeId"
+					>
+						<template #default="{ node, data }">
+							<span>{{ data.name }}</span>
+							<span v-if="!node.isLeaf"> ({{ data.child.length }}) </span>
+						</template>
+					</el-cascader>
 				</el-form-item>
 				<el-form-item label="创建时间" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="daterange"
+						type="datetimerange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始日期"
 						end-placeholder="结束日期"
 						:shortcuts="shortcuts"
-						format="YYYY-MM-DD"
 						@change="tiemChange"
+						value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 					/>
 					<!-- value-format="YYYY-MM-DD" -->
 				</el-form-item>
 				<el-form-item>
-					<el-button type="primary" @click="getList" :loading="loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button type="primary" @click="getList" :loading="state.loading" v-waves> <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>
@@ -40,19 +51,19 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableList" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
-				<el-table-column prop="fromNo" label="标题" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="toNo" label="类型" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="toNo" label="创建时间" show-overflow-tooltip width="170">
+				<el-table-column prop="title" label="标题" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="knowledgeTypeName" label="类型" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="lastModificationTime" label="创建时间" show-overflow-tooltip width="170">
 					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						<span>{{ formatDate(scope.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="scope">
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="编辑"> 编辑 </el-button>
-						<el-button text type="danger" @click="onPalySoundRecording(scope.row)" title="删除"> 删除 </el-button>
+						<el-button text type="primary" @click="onEdit(scope.row)" title="编辑"> 编辑 </el-button>
+						<el-button text type="danger" @click="onDel(scope.row)" title="删除"> 删除 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -60,22 +71,24 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
 	</div>
 </template>
 
 <script lang="ts" setup name="knowledgeDraft">
-import { ref, reactive, toRefs, onMounted } from 'vue';
+import { ref, reactive, onMounted, onActivated } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { ElMessage } from 'element-plus';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { treelist } from '/@/api/knowledge/type';
 import { formatDate } from '/@/utils/formatTime';
+import { useRouter } from 'vue-router';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 // 引入节流
 import { throttle } from '/@/utils/tools';
-import { mydraftslist } from '/@/api/knowledge/draft';
+import { mydraftslist, removedrafts } from '/@/api/knowledge/draft';
 
 const shortcuts = [
 	{
@@ -118,6 +131,7 @@ const state = reactive(<any>{
 		StartTime: '',
 		EndTime: '',
 	},
+	typeData: [], // 知识分类
 	tableList: [],
 	loading: false,
 	total: 0,
@@ -137,9 +151,9 @@ const state = reactive(<any>{
 		},
 	],
 });
+const router = useRouter();
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
-const { queryParams, tableList, loading, total, directionList } = toRefs(state);
 const ruleFormRef = ref<FormInstance>();
 // 创建时间
 const tiemChange = (val: string[]) => {
@@ -148,9 +162,10 @@ const tiemChange = (val: string[]) => {
 };
 /** 获取草稿箱列表 */
 const getList = () => {
-	queryParams.value.PageIndex = 1;
 	state.loading = true;
-	mydraftslist(queryParams.value)
+	let request = JSON.parse(JSON.stringify(state.queryParams));
+	Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
+	mydraftslist(request)
 		.then((response: any) => {
 			state.tableList = response?.result.items ?? [];
 			state.total = response?.result.total;
@@ -170,11 +185,32 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	formEl.resetFields();
 	getList();
 }, 1000);
-// 切换tab 查询列表
-const handleClick = () => {
-	getList();
+// 修改知识
+const onEdit = (row: any) => {
+	router.push({
+		name: 'knowledgeEdit',
+		params: {
+			id: row.id,
+			tagsViewName: '编辑知识草稿',
+		},
+	});
+};
+const onDel = (row: any) => {
+	ElMessageBox.confirm(`确定要从草稿箱删除`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			removedrafts(row.id).then(() => {
+				ElMessage.success('操作成功');
+				getList();
+			});
+		})
+		.catch(() => {});
 };
-const onPalySoundRecording = (row: any) => {};
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
@@ -193,8 +229,23 @@ const onImportTable = () => {
 	];
 	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
 };
+// 知识分类
+const getKnowledgeType = async () => {
+	state.loading = true;
+	try {
+		const res: any = await treelist();
+		state.typeData = res.result ?? [];
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+	}
+};
 onMounted(() => {
 	getList();
+	getKnowledgeType();
+});
+onActivated(() => {
+	getList();
 });
 </script>
 <style lang="scss" scoped></style>

+ 148 - 60
src/views/knowledge/knowledge/index.vue

@@ -4,7 +4,7 @@
 			<el-row :gutter="20" class="h100">
 				<!-- 左侧组织树 -->
 				<el-col :xs="6" :sm="6" :md="4" :lg="4" :xl="4" class="orgTree">
-					<div class="w100 h100 pr10">
+					<div class="h100 pr10">
 						<el-tabs v-model="state.activeName" stretch>
 							<el-tab-pane label="部门" name="0">
 								<el-input v-model="filterOrg" placeholder="请输入部门名称" class="input-with-select mt10 mb10" clearable>
@@ -41,12 +41,13 @@
 									:filter-node-method="filterNode"
 									default-expand-all
 									node-key="id"
+									style="min-width: 100%; display: inline-block"
 								>
 								</el-tree>
 							</el-scrollbar>
 						</div>
 						<div v-show="state.activeName === '1'" style="height: calc(100% - 100px);'">
-							<el-scrollbar height="100%">
+							<el-scrollbar>
 								<el-tree
 									:data="state.typeData"
 									highlight-current
@@ -58,12 +59,13 @@
 									:filter-node-method="filterNodeType"
 									default-expand-all
 									node-key="id"
+									style="min-width: 100%; display: inline-block"
 								>
 								</el-tree>
 							</el-scrollbar>
 						</div>
 						<div v-show="state.activeName === '2'" style="height: calc(100% - 100px);'">
-							<el-scrollbar height="100%">
+							<el-scrollbar>
 								<el-tree
 									filterable
 									highlight-current
@@ -76,6 +78,7 @@
 									ref="hotRef"
 									:filter-node-method="filterNodeHot"
 									:expand-on-click-node="false"
+									style="min-width: 100%; display: inline-block"
 								>
 									<template #default="{ data }">
 										<span :title="data.hotSpotName">
@@ -92,11 +95,11 @@
 					<el-scrollbar class="pr10" ref="rightScrollRef">
 						<div class="flex-column">
 							<el-tabs v-model="state.queryParams.Status" @tab-change="handleClick">
-								<el-tab-pane label="全部" name="1"></el-tab-pane>
-								<el-tab-pane label="已上架" name="2"></el-tab-pane>
-								<el-tab-pane label="已下架" name="3"></el-tab-pane>
-								<el-tab-pane label="审核中" name="4"></el-tab-pane>
-								<el-tab-pane label="审核不通过" name="5"></el-tab-pane>
+								<el-tab-pane label="全部" name=" "></el-tab-pane>
+								<el-tab-pane label="已上架" name="3"></el-tab-pane>
+								<el-tab-pane label="已下架" name="4"></el-tab-pane>
+								<el-tab-pane label="审核中" name="1"></el-tab-pane>
+								<el-tab-pane label="审核不通过" name="2"></el-tab-pane>
 							</el-tabs>
 							<!-- 搜索条件 -->
 							<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="pl15 pr15 pt15">
@@ -112,40 +115,40 @@
 								<el-form-item label="创建时间" prop="crTime">
 									<el-date-picker
 										v-model="state.queryParams.crTime"
-										type="daterange"
+										type="datetimerange"
 										unlink-panels
 										range-separator="至"
 										start-placeholder="开始日期"
 										end-placeholder="结束日期"
 										:shortcuts="shortcuts"
-										format="YYYY-MM-DD"
 										@change="timeStartChangeCr"
+										value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 									/>
 								</el-form-item>
 								<el-form-item label="上架时间" prop="sjTime">
 									<el-date-picker
 										v-model="state.queryParams.sjTime"
-										type="daterange"
+										type="datetimerange"
 										unlink-panels
 										range-separator="至"
 										start-placeholder="开始日期"
 										end-placeholder="结束日期"
 										:shortcuts="shortcuts"
-										format="YYYY-MM-DD"
 										@change="timeStartChangeSj"
+										value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 									/>
 								</el-form-item>
 								<el-form-item label="下架时间" prop="xjTime">
 									<el-date-picker
 										v-model="state.queryParams.xjTime"
-										type="daterange"
+										type="datetimerange"
 										unlink-panels
 										range-separator="至"
 										start-placeholder="开始日期"
 										end-placeholder="结束日期"
 										:shortcuts="shortcuts"
-										format="YYYY-MM-DD"
 										@change="timeStartChangeXj"
+										value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 									/>
 								</el-form-item>
 								<el-form-item>
@@ -158,7 +161,7 @@
 							<div class="flex-center-between mb20">
 								<p class="table-title"></p>
 								<div>
-									<el-button type="primary" @click="onOpenAddUser" v-auth="'100102'"> <SvgIcon name="ele-Plus" class="mr5" />创建知识 </el-button>
+									<el-button type="primary" @click="onOpenAddUser"> <SvgIcon name="ele-Plus" class="mr5" />创建知识 </el-button>
 									<el-button type="primary" @click="onImportTable" :disabled="!state.multipleSelection.length">
 										<SvgIcon name="iconfont icon-daochu" class="mr5" />导出
 									</el-button>
@@ -168,18 +171,16 @@
 							<el-table :data="state.tableData" v-loading="state.tableLoading" row-key="id" @selection-change="handleSelectionChange">
 								<el-table-column type="selection" width="55" :reserve-selection="true" />
 								<el-table-column prop="title" label="标题" show-overflow-tooltip width="120"></el-table-column>
-								<el-table-column prop="knowledgeTypeName" label="类型" show-overflow-tooltip width="120"></el-table-column>
-								<el-table-column prop="hotspotName" label="热点" show-overflow-tooltip width="190"></el-table-column>
-								<el-table-column prop="creationName" label="创建人" show-overflow-tooltip width="300"></el-table-column>
-								<el-table-column prop="creationBMName" label="创建部门" show-overflow-tooltip width="130"></el-table-column>
+								<el-table-column prop="knowledgeTypeName" label="类型" show-overflow-tooltip width="200"></el-table-column>
+								<el-table-column prop="hotspotName" label="热点" show-overflow-tooltip width="200"></el-table-column>
+								<el-table-column prop="creationName" label="创建人" show-overflow-tooltip width="120"></el-table-column>
+								<el-table-column prop="creationBMName" label="创建部门" show-overflow-tooltip width="150"></el-table-column>
 								<el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip width="170">
 									<template #default="scope">
 										<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 									</template>
 								</el-table-column>
 								<el-table-column prop="pageView" label="阅读次数" show-overflow-tooltip></el-table-column>
-								<el-table-column prop="phoneNo" label="评价数" show-overflow-tooltip></el-table-column>
-								<el-table-column prop="phoneNo" label="点赞数" show-overflow-tooltip></el-table-column>
 								<el-table-column prop="onShelfTime" label="上架时间" show-overflow-tooltip width="170">
 									<template #default="scope">
 										<span>{{ formatDate(scope.row.onShelfTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
@@ -195,17 +196,28 @@
 										<span>{{ formatDate(scope.row.lastModificationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 									</template>
 								</el-table-column>
-								<el-table-column prop="status" label="状态" show-overflow-tooltip width="60"></el-table-column>
-								<el-table-column label="操作" width="250" fixed="right" align="center">
-									<template #default="scope">
-										<el-button text type="primary" @click="onOpenEditUser(scope.row)" title="预览"> 预览 </el-button>
-										<el-button text type="primary" @click="onOpenEditUser(scope.row)" title="编辑"> 编辑 </el-button>
-										<el-button text type="primary" @click="onOpenEditUser(scope.row)" title="下架"> 下架 </el-button>
-										<el-button text type="primary" @click="onOpenEditUser(scope.row)" title="上架"> 上架 </el-button>
-										<el-button text type="primary" @click="onOpenEditUser(scope.row)" title="查看审核记录"> 查看审核记录 </el-button>
-										<el-button text type="danger" @click="onRecall(scope.row)" title="撤回"> 撤回 </el-button>
-										<el-button text type="danger" @click="onRowDel(scope.row)" title="删除"> 删除 </el-button>
-										<el-button text type="primary" @click="onOpenEditUser(scope.row)" title="发起更新申请"> 发起更新申请 </el-button>
+								<el-table-column prop="status" label="状态" show-overflow-tooltip width="100">
+									<template #default="{ row }">
+										<span v-if="row.status === 1" style="color: var(--el-color-primary)">审核中</span>
+										<span v-if="row.status === 2" style="color: var(--el-color-danger)">审核不通过</span>
+										<span v-if="row.status === 3" style="color: var(--el-color-success)">已上架</span>
+										<span v-if="row.status === 4" style="color: var(--el-color-info)">已下架</span>
+									</template>
+								</el-table-column>
+								<el-table-column label="操作" width="300" fixed="right" align="center">
+									<template #default="{ row }">
+										<el-button text type="primary" @click="onPreview(row)" title="预览" v-if="[1, 2, 3, 4].includes(row.status)"> 预览 </el-button>
+										<el-button text type="primary" @click="onEdit(row)" title="编辑" v-if="[2, 3, 4].includes(row.status)"> 编辑 </el-button>
+										<el-button text type="primary" @click="onOffshelf(row)" title="下架" v-if="[3].includes(row.status)"> 下架 </el-button>
+										<el-button text type="primary" @click="ontheshelf(row)" title="上架" v-if="[4].includes(row.status)"> 上架 </el-button>
+										<el-button text type="primary" @click="onRecord(row)" title="查看审核记录" v-if="[1, 2].includes(row.status)">
+											查看审核记录
+										</el-button>
+										<el-button text type="danger" @click="onRecall(row)" title="撤回" v-if="[1].includes(row.status)"> 撤回 </el-button>
+										<el-button text type="danger" @click="onRowDel(row)" title="删除" v-if="[2, 3, 4].includes(row.status)"> 删除 </el-button>
+										<el-button text type="primary" @click="onRenew(row)" title="发起更新申请" v-if="[3, 4].includes(row.status)">
+											发起更新申请
+										</el-button>
 									</template>
 								</el-table-column>
 								<template #empty>
@@ -224,28 +236,32 @@
 				</el-col>
 			</el-row>
 		</div>
-
-		<AddKnowledge ref="AddKnowledgeRef" @updateList="handleQuery" />
-		<EditKnowledge ref="EditKnowledgeRef" @updateList="handleQuery" />
+		<!-- 预览 -->
+		<Preview ref="previewRef" />
+		<!-- 审核记录 -->
+		<ProcessRecord ref="processRecordRef"/>
+		<!-- 流程组件 -->
+		<Process ref="processRef" @onSubmitProcess="onSubmitProcess" />
 	</div>
 </template>
 
 <script lang="ts" setup name="knowledge">
-import { defineAsyncComponent, ref, reactive, onMounted, watch } from 'vue';
+import { ref, reactive, onMounted, watch, onActivated, defineAsyncComponent } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
+import { useRouter } from 'vue-router';
 import type { FormInstance } from 'element-plus';
 import table2excel from 'js-table2excel';
 import { formatDate } from '/@/utils/formatTime';
-import { throttle } from '/@/utils/tools';
-import { delUser, restPwd } from '/@/api/system/user';
-import { KnowledgePaged } from '/@/api/knowledge';
+import { throttle,commonEeum } from '/@/utils/tools';
+import { KnowledgePaged,KnowledgeRevoke,KnowledgeOffshelf,KnowledgeOntheshelf} from '/@/api/knowledge';
 import { getOrgList } from '/@/api/system/organize';
 import { treelist } from '/@/api/knowledge/type';
 import { hotspottype } from '/@/api/business/order';
 
 // 引入组件
-const AddKnowledge = defineAsyncComponent(() => import('/@/views/knowledge/knowledge/component/add.vue'));
-const EditKnowledge = defineAsyncComponent(() => import('/@/views/knowledge/knowledge/component/edit.vue'));
+const Preview = defineAsyncComponent(() => import('/@/views/knowledge/component/Preview.vue'));
+const ProcessRecord = defineAsyncComponent(() => import('/@/views/knowledge/component/ProcessRecord.vue'));
+const Process = defineAsyncComponent(() => import('/@/views/knowledge/component/Process.vue'));
 const shortcuts = [
 	{
 		text: '近一周',
@@ -281,7 +297,7 @@ const state = reactive<any>({
 		PageIndex: 1,
 		PageSize: 10,
 		Keyword: '',
-		Status: '1',
+		Status: ' ',
 	},
 	activeName: '0',
 	tableData: [],
@@ -293,11 +309,12 @@ const state = reactive<any>({
 	typeData: [],
 	options: [],
 });
+const router = useRouter();
 const ruleFormRef = ref<FormInstance>(); //表单ref
-const AddKnowledgeRef = ref(); //新增知识
-const EditKnowledgeRef = ref(); //修改知识
 const rightScrollRef = ref();
-
+const previewRef = ref();
+const processRecordRef = ref();
+const processRef = ref();
 // 热点分类远程搜索
 const HotspotProps = {
 	label: 'hotSpotFullName',
@@ -399,6 +416,10 @@ const getOrgListApi = async () => {
 /** 获取知识列表 */
 const getList = () => {
 	state.tableLoading = true;
+	let request = JSON.parse(JSON.stringify(state.queryParams));
+	Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
+	Reflect.deleteProperty(request, 'sjTime'); // 删除无用的参数
+	Reflect.deleteProperty(request, 'xjTime'); // 删除无用的参数
 	KnowledgePaged(state.queryParams)
 		.then((response: any) => {
 			state.tableData = response?.result.items ?? [];
@@ -428,10 +449,6 @@ const handleNodeClick = (data: any) => {
 	}
 	getList();
 };
-// 创建知识
-const onOpenAddUser = () => {
-	AddKnowledgeRef.value.openDialog(state.typeData);
-};
 // 表格多选
 const handleSelectionChange = (val: any) => {
 	state.multipleSelection = val;
@@ -448,13 +465,41 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	hotRef.value?.setCurrentKey(null);
 	handleQuery();
 }, 1000);
+// 创建知识
+const onOpenAddUser = () => {
+	router.push({
+		path: '/knowledge/add',
+	});
+};
 // 修改知识
-const onOpenEditUser = (row: any) => {
-	EditKnowledgeRef.value.openDialog(row, state.typeData);
+const onEdit = (row: any) => {
+	router.push({
+		name: 'knowledgeEdit',
+		params: {
+			id: row.id,
+			tagsViewName: '编辑知识',
+		},
+	});
 };
-// 撤回
-const onRecall = (row: any) => {
-	ElMessageBox.confirm(`确定要撤回【${row.title}】?`, '提示', {
+// 预览
+const onPreview = (row:any) => {
+	previewRef.value.openDialog(row);
+};
+// 查看审核记录
+const onRecord = (row:any) => {
+	processRecordRef.value.openDialog(row);
+};
+// 发起更新 修改申请
+const onRenew = (row:any) => {
+	processRef.value.openDialog({ id: row.workflowId, title: '更新知识', commonEeum: commonEeum.Seat, processType: 'editStart' });
+};
+// 发起更新成功
+const onSubmitProcess = ()=>{
+	handleQuery();
+}
+// 下架
+const onOffshelf = (row: any) => {
+	ElMessageBox.confirm(`是否确定要下架?知识下架后,将不会被检索到!`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
 		type: 'warning',
@@ -462,7 +507,7 @@ const onRecall = (row: any) => {
 		cancelButtonClass: 'default-button',
 	})
 		.then(() => {
-			restPwd(row.id).then(() => {
+			KnowledgeOffshelf(row.id).then(() => {
 				ElMessage.success('操作成功');
 				handleQuery();
 				state.queryParams.OrgCode = '';
@@ -471,18 +516,54 @@ const onRecall = (row: any) => {
 		})
 		.catch(() => {});
 };
-// 删除知识
-const onRowDel = (row: any) => {
-	ElMessageBox.confirm(`确定要申请删除【${row.title}】?`, '提示', {
+// 上架
+const ontheshelf = (row: any) => {
+	ElMessageBox.confirm(`是否确定要上架?`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
+		type: 'warning',
 		draggable: true,
 		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			KnowledgeOntheshelf(row.id).then(() => {
+				ElMessage.success('操作成功');
+				handleQuery();
+				state.queryParams.OrgCode = '';
+				getOrgListApi();
+			});
+		})
+		.catch(() => {});
+	// ElMessageBox.confirm(`知识已过有效期,无法直接上架,请到【编辑】页面,修改有效期。`, '提示', {
+	// 	confirmButtonText: '去编辑',
+	// 	cancelButtonText: '取消',
+	// 	type: 'warning',
+	// 	draggable: true,
+	// 	cancelButtonClass: 'default-button',
+	// })
+	// 	.then(() => {
+	// 		restPwd(row.id).then(() => {
+	// 			ElMessage.success('操作成功');
+	// 			handleQuery();
+	// 			state.queryParams.OrgCode = '';
+	// 			getOrgListApi();
+	// 		});
+	// 	})
+	// 	.catch(() => {});
+};
+
+// 撤回
+const onRecall = (row: any) => {
+	ElMessageBox.confirm(`是否确定要撤回?撤回成功后请到【我的草稿箱】中进行查看和管理`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
 		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
 	})
 		.then(() => {
-			delUser(row.id).then(() => {
-				ElMessage.success('删除成功');
+			KnowledgeRevoke(row.id).then(() => {
+				ElMessage.success('操作成功');
 				handleQuery();
 				state.queryParams.OrgCode = '';
 				getOrgListApi();
@@ -490,6 +571,10 @@ const onRowDel = (row: any) => {
 		})
 		.catch(() => {});
 };
+// 删除知识
+const onRowDel = (row: any) => {
+	processRef.value.openDialog({ id: row.workflowId, title: '删除知识', commonEeum: commonEeum.Seat, processType: 'deleteStart' });
+};
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
@@ -508,6 +593,9 @@ onMounted(() => {
 	getList();
 	getOrgListApi();
 });
+onActivated(() => {
+	getList();
+});
 </script>
 <style lang="scss" scoped>
 .knowledge-knowledge-container {

+ 74 - 44
src/views/knowledge/process/index.vue

@@ -1,22 +1,21 @@
 <template>
 	<div class="telslog-callRecord-container layout-pd">
 		<el-card shadow="never">
-			<el-tabs v-model="queryParams.EKnowledgeWorkFlowStatus" @tab-change="handleClick">
-				<el-tab-pane label="全部" name="1"></el-tab-pane>
-				<el-tab-pane label="待审核" name="2"></el-tab-pane>
-				<el-tab-pane label="审核通过" name="3"></el-tab-pane>
-				<el-tab-pane label="审核不通过" name="4"></el-tab-pane>
-				<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+			<el-tabs v-model="state.queryParams.EKnowledgeWorkFlowStatus" @tab-change="handleClick">
+				<el-tab-pane label="全部" name=" "></el-tab-pane>
+				<el-tab-pane label="待审核" name="1"></el-tab-pane>
+				<el-tab-pane label="审核通过" name="2"></el-tab-pane>
+				<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 					<el-form-item label="审核类型" prop="EKnowledgeApplyType">
-						<el-select v-model="queryParams.EKnowledgeApplyType" placeholder="请选择审核类型" class="w100">
-							<el-option v-for="item in directionList" :key="item.value" :label="item.label" :value="item.value" />
+						<el-select v-model="state.queryParams.EKnowledgeApplyType" placeholder="请选择审核类型" class="w100">
+							<el-option v-for="item in state.directionList" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="关键字" prop="Keyword">
-						<el-input v-model="queryParams.Keyword" placeholder="标题/创建人/创建部门" clearable style="width: 300px;"> </el-input>
+						<el-input v-model="state.queryParams.Keyword" placeholder="标题/创建人/创建部门" clearable style="width: 300px"> </el-input>
 					</el-form-item>
 					<el-form-item>
-						<el-button type="primary" @click="getList" :loading="loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+						<el-button type="primary" @click="getList" :loading="state.loading" v-waves> <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>
@@ -32,41 +31,47 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableList" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
-				<el-table-column prop="fromNo" label="审核类型" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="knowledgeTypeName" label="审核类型" show-overflow-tooltip>
+					<template #default="{ row }">
+						<span v-if="row.workflowModuleStatus === 0" style="color: var(--el-color-primary)">发布知识审核</span>
+						<span v-if="row.workflowModuleStatus === 1" style="color: var(--el-color-info)">更新知识审核</span>
+						<span v-if="row.workflowModuleStatus === 2" style="color: var(--el-color-danger)">删除知识审核</span>
+					</template>
+				</el-table-column>
 				<el-table-column prop="title" label="标题" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="toNo" label="类型" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="knowledgeTypeName" label="类型" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="creationName" label="创建人" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="createBMName" label="创建部门" show-overflow-tooltip></el-table-column>
 				<el-table-column label="状态" show-overflow-tooltip>
-					<template #default="scope">
-						<el-button text type="primary">
-							{{ scope.row.toNo }}
-						</el-button>
+					<template #default="{ row }">
+						<span v-if="row.status === 1" style="color: var(--el-color-primary)">待审批</span>
+						<span v-if="row.status === 2" style="color: var(--el-color-danger)">审批成功</span>
+						<span v-if="row.status === 3" style="color: var(--el-color-success)">已撤销</span>
 					</template>
 				</el-table-column>
 
 				<el-table-column prop="toNo" label="创建时间" show-overflow-tooltip width="170">
-					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					<template #default="{row}">
+						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="到达该节点时间" show-overflow-tooltip width="170">
-					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					<template #default="{row}">
+						<span>{{ formatDate(row.currentStepTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="审核时间" show-overflow-tooltip width="170">
-					<template #default="scope">
-						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					<template #default="{row}">
+						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="120" fixed="right" align="center">
-					<template #default="scope">
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="预览"> 预览 </el-button>
-						<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="审核"> 审核 </el-button>
-						<el-button text type="danger" @click="onPalySoundRecording(scope.row)" title="查看审核记录">查看审核记录 </el-button>
+				<el-table-column label="操作" width="200" fixed="right" align="center">
+					<template #default="{row}">
+						<el-button text type="primary" @click="onPreview(row)" title="预览" v-if="[1,2].includes(row.status)"> 预览 </el-button>
+						<el-button text type="primary" @click="onProcess(row)" title="审核" v-if="[1].includes(row.status)"> 审核 </el-button>
+						<el-button text type="info" @click="onRecord(row)" title="查看审核记录" v-if="[1,2].includes(row.status)">查看审核记录 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -74,29 +79,39 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
+		<!-- 预览 -->
+		<Preview ref="previewRef" />
+		<!-- 审核记录 -->
+		<ProcessRecord ref="processRecordRef" />
+		<!-- 流程组件 -->
+		<Process ref="processRef" @onSubmitProcess="onSubmitProcess" />
 	</div>
 </template>
 
 <script lang="ts" setup name="knowledgeProcess">
-import { ref, reactive, toRefs, onMounted } from 'vue';
+import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { ElMessage } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 // 引入节流
-import { throttle } from '/@/utils/tools';
+import { throttle,commonEeum } from '/@/utils/tools';
 import { KnowledgeApprovedlist } from '/@/api/knowledge';
 
+// 引入组件
+const Preview = defineAsyncComponent(() => import('/@/views/knowledge/component/Preview.vue'));
+const ProcessRecord = defineAsyncComponent(() => import('/@/views/knowledge/component/ProcessRecord.vue'));
+const Process = defineAsyncComponent(() => import('/@/views/knowledge/component/Process.vue'));
+
 // 定义变量内容
 const state = reactive(<any>{
 	queryParams: {
 		PageIndex: 1,
 		PageSize: 10,
-		EKnowledgeWorkFlowStatus: '1',
+		EKnowledgeWorkFlowStatus: ' ',
 	},
 	tableList: [],
 	loading: false,
@@ -104,28 +119,30 @@ const state = reactive(<any>{
 	multipleSelection: [],
 	directionList: [
 		{
-			label: '全部',
-			value: '',
-		},
-		{
-			label: '呼入',
+			label: '发布知识审核',
 			value: 0,
 		},
 		{
-			label: '呼出',
+			label: '更新知识审核',
 			value: 1,
 		},
+		{
+			label: '删除知识审核',
+			value: 2,
+		},
 	],
 });
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
-const { queryParams, tableList, loading, total, directionList } = toRefs(state);
 const ruleFormRef = ref<FormInstance>();
+const previewRef = ref();
+const processRecordRef = ref();
+const processRef = ref();
 /** 获取审核列表 */
 const getList = () => {
-	queryParams.value.PageIndex = 1;
+	state.queryParams.PageIndex = 1;
 	state.loading = true;
-	KnowledgeApprovedlist(queryParams.value)
+	KnowledgeApprovedlist(state.queryParams)
 		.then((response: any) => {
 			state.tableList = response?.result.items ?? [];
 			state.total = response?.result.total;
@@ -149,9 +166,22 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 const handleClick = () => {
 	getList();
 };
-const onPalySoundRecording = (row:any)=>{
-
+// 预览
+const onPreview = (row: any) => {
+	previewRef.value.openDialog(row);
+};
+// 审核
+const onProcess = (row: any) => {
+	processRef.value.openDialog({ id: row.workflowId, title:'提交', processType: 'next', commonEeum: commonEeum.OrderCirculation });
+};
+// 发起更新成功
+const onSubmitProcess = ()=>{
+	getList();
 }
+// 查看审核记录
+const onRecord = (row: any) => {
+	processRecordRef.value.openDialog(row);
+};
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [

+ 10 - 1
src/views/system/organize/index.vue

@@ -38,7 +38,7 @@
 </template>
 <script lang="ts" setup name="organize">
 import { defineAsyncComponent, ref, h, reactive, onMounted, watch } from 'vue';
-import { ElButton } from 'element-plus';
+import { ElButton,ElTag } from 'element-plus';
 import { getOrgList } from '/@/api/system/organize';
 import { formatDate } from '/@/utils/formatTime';
 import SvgIcon from '/@/views/system/menu/component/SvgIcon.vue';
@@ -71,6 +71,15 @@ const state = reactive({
 			title: '部门编码',
 			width: 200,
 		},
+		{
+			key: 'isEnable',
+			dataKey: 'isEnable',
+			title: '状态',
+			width: 100,
+			cellRenderer: (data: any) => {
+				return h(ElTag, { type: data.rowData.isEnable ? 'success' : 'info' }, { default: () => (data.rowData.isEnable ? '启用' : '禁用') });
+			},
+		},
 		{
 			key: 'creationTime',
 			dataKey: 'creationTime',

+ 3 - 18
src/views/system/user/index.vue

@@ -6,18 +6,16 @@
 				<el-col :xs="6" :sm="6" :md="4" :lg="4" :xl="4" class="orgTree">
 					<el-scrollbar height="100%" class="pr10">
 						<template v-if="state.orgData.length">
-							<el-button type="primary" text @click="changeOpen" class="mb10">
-								{{ state.isExpansion ? '全部收起' : '全部展开' }}
-							</el-button>
 							<el-tree
 								:data="state.orgData"
 								highlight-current
 								:expand-on-click-node="false"
-								:default-expand-all="state.isExpansion"
+								default-expand-all
 								:props="{ children: 'children', label: 'orgName' }"
 								@node-click="handleNodeClick"
 								ref="treRef"
 								v-loading="state.loading"
+								node-key="id"
 							>
 							</el-tree>
 						</template>
@@ -139,7 +137,6 @@ interface QueryState {
 	};
 	tableData: Array<any>;
 	total: number;
-	isExpansion: boolean;
 	tableLoading: boolean;
 	loading: boolean;
 	multipleSelection: Array<any>;
@@ -163,7 +160,6 @@ const state = reactive<QueryState>({
 	multipleSelection: [],
 	orgData: [],
 	options: [],
-	isExpansion: false,
 });
 const ruleFormRef = ref<FormInstance>(); //表单ref
 const addUserRef = ref(); //新增用户
@@ -212,14 +208,6 @@ const getRolesFn = () => {
 		}));
 	});
 };
-// 切换展开收起
-const changeOpen = () => {
-	state.isExpansion = !state.isExpansion;
-	let allNodes = treRef.value.store.nodesMap;
-	for (let x in allNodes) {
-		allNodes[x].expanded = state.isExpansion;
-	}
-};
 // 点击节点
 const handleNodeClick = (data: any) => {
 	state.queryParams.OrgCode = data.orgCode;
@@ -242,8 +230,7 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
 	state.queryParams.OrgCode = '';
-	state.isExpansion = false;
-	getOrgListApi();
+	treRef.value?.setCurrentKey(null);
 	handleQuery();
 }, 1000);
 // 打开修改用户弹窗
@@ -264,7 +251,6 @@ const onRestPwd = (row: any) => {
 				ElMessage.success('操作成功');
 				handleQuery();
 				state.queryParams.OrgCode = '';
-				state.isExpansion = false;
 				getOrgListApi();
 			});
 		})
@@ -284,7 +270,6 @@ const onRowDel = (row: any) => {
 				ElMessage.success('删除成功');
 				handleQuery();
 				state.queryParams.OrgCode = '';
-				state.isExpansion = false;
 				getOrgListApi();
 			});
 		})

+ 1 - 2
src/views/tels/blacklist/component/addBlacklist.vue

@@ -46,8 +46,7 @@
                                 range-separator="至"
                                 start-placeholder="开始时间"
                                 end-placeholder="结束时间"
-                                format="YYYY-MM-DD hh:mm:ss"
-                                value-format="YYYY-MM-DD hh:mm:ss"
+                                value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
                             />
                         </el-form-item>
                     </el-col>

+ 1 - 2
src/views/tels/blacklist/index.vue

@@ -19,12 +19,11 @@
 				<el-form-item label="时间" prop="time">
 					<el-date-picker
 						v-model="queryParams.time"
-						format="YYYY-MM-DD"
-						value-format="YYYY-MM-DD"
 						type="daterange"
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
+						value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 					/>
 				</el-form-item>
 				<el-form-item>

+ 1 - 2
src/views/tels/telsLog/index.vue

@@ -6,12 +6,11 @@
 				<el-form-item label="时间" prop="time">
 					<el-date-picker
 						v-model="queryParams.time"
-						format="YYYY-MM-DD"
-						value-format="YYYY-MM-DD"
 						type="daterange"
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
+						value-format="YYYY-MM-DD[T]HH:mm:ss.sss[Z]"
 					/>
 				</el-form-item>
 				<el-form-item>