index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <template>
  2. <div class="business-discern-container layout-pd">
  3. <!-- 搜索 -->
  4. <el-card shadow="never">
  5. <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
  6. <el-form-item label="关键字" prop="Keyword">
  7. <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
  8. </el-form-item>
  9. <el-form-item label="甄别申请状态" prop="Status">
  10. <el-select v-model="state.queryParams.Status" placeholder="请选择甄别申请状态" @change="handleQuery">
  11. <el-option v-for="item in state.screenStatus" :value="item.key" :key="item.key" :label="item.value" />
  12. </el-select>
  13. </el-form-item>
  14. <!-- <el-form-item label="甄别类型" prop="AcceptType">
  15. <el-select v-model="state.queryParams.AcceptType" placeholder="请选择甄别类型" class="w100">
  16. <el-option v-for="item in state.screenType" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  17. </el-select>
  18. </el-form-item>-->
  19. <el-form-item label="甄别时间" prop="exTime">
  20. <el-date-picker
  21. v-model="state.queryParams.exTime"
  22. type="datetimerange"
  23. unlink-panels
  24. range-separator="至"
  25. start-placeholder="开始时间"
  26. end-placeholder="结束时间"
  27. :shortcuts="shortcuts"
  28. @change="timeStartChangeCr"
  29. value-format="YYYY-MM-DD[T]HH:mm:ss"
  30. :default-time="defaultTimeStartEnd"
  31. />
  32. </el-form-item>
  33. <el-form-item>
  34. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  35. <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
  36. <SvgIcon name="ele-Refresh" class="mr5" />重置
  37. </el-button>
  38. </el-form-item>
  39. </el-form>
  40. </el-card>
  41. <el-card shadow="never">
  42. <ProTable
  43. ref="proTableRef"
  44. :columns="columns"
  45. :data="state.tableData"
  46. @updateTable="queryList"
  47. :loading="state.loading"
  48. :total="state.total"
  49. v-model:page-index="state.queryParams.PageIndex"
  50. v-model:page-size="state.queryParams.PageSize"
  51. >
  52. <template #title="{ row }">
  53. <order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
  54. </template>
  55. <!-- 表格操作 -->
  56. <template #operation="{ row }">
  57. <el-button link type="primary" @click="onDetail(row)" title="查看甄别详情"> 甄别详情 </el-button>
  58. <order-detail :order="row.order" @updateList="queryList" />
  59. </template>
  60. </ProTable>
  61. </el-card>
  62. <!-- 甄别详情 -->
  63. <discern-detail ref="discernDetailRef" @updateList="queryList" />
  64. <!-- 甄别修改 -->
  65. <discern-edit ref="discernEditRef" @updateList="queryList" />
  66. </div>
  67. </template>
  68. <script setup lang="tsx" name="businessDiscern">
  69. import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
  70. import { FormInstance } from 'element-plus';
  71. import { formatDate } from '@/utils/formatTime';
  72. import { defaultTimeStartEnd, shortcuts } from "@/utils/constants";
  73. import { screenBaseData, screenDetail, screenList } from '@/api/business/discern';
  74. import other from '@/utils/other';
  75. // 引入组件
  76. const DiscernDetail = defineAsyncComponent(() => import('@/views/business/discern/components/Discern-detail.vue')); // 甄别详情
  77. const DiscernEdit = defineAsyncComponent(() => import('@/views/business/discern/components/Discern-edit.vue')); // 甄别修改
  78. const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
  79. const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
  80. const proTableRef = ref<RefType>(); // 表格ref
  81. // 表格配置项
  82. const columns = ref<any[]>([
  83. { prop: 'order.no', label: '工单编码', width: 150 },
  84. { prop: 'statusText', label: '甄别状态', width: 100 },
  85. { prop: 'order.isProvinceText', label: '省/市工单', width: 100 },
  86. { prop: 'order.title', label: '工单标题', width: 300 },
  87. { prop: 'order.sourceChannel', label: '来源渠道', width: 120 },
  88. { prop: 'order.acceptType', label: '受理类型', width: 120 },
  89. { prop: 'order.hotspotName', label: '热点分类', width: 200 },
  90. { prop: 'order.acceptorName', label: '受理人', width: 170 },
  91. { prop: 'order.orgLevelOneName', label: '一级部门', width: 150 },
  92. { prop: 'order.actualHandleOrgName', label: '接办部门', width: 150 },
  93. {
  94. prop: 'order.startTime',
  95. label: '受理时间',
  96. width: 170,
  97. render: (scope) => {
  98. return <span>{formatDate(scope.row.order?.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
  99. },
  100. },
  101. {
  102. prop: 'order.filedTime',
  103. label: '办结时间',
  104. width: 170,
  105. render: (scope) => {
  106. return <span>{formatDate(scope.row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
  107. },
  108. },
  109. {
  110. prop: 'visit.publishTime',
  111. label: '发布时间',
  112. width: 170,
  113. render: (scope) => {
  114. return <span>{formatDate(scope.row.visit?.publishTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
  115. },
  116. },
  117. {
  118. prop: 'visit.visitTime',
  119. label: '回访时间',
  120. width: 170,
  121. render: (scope) => {
  122. return <span>{formatDate(scope.row.visit?.visitTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
  123. },
  124. },
  125. { prop: 'order.counterSignTypeText', label: '是否会签', width: 100 },
  126. { prop: 'visit.employee', label: '回访人' },
  127. { prop: 'visitDetail.visitOrgName', label: '被回访部门', width: 150 },
  128. {
  129. prop: 'creationTime',
  130. label: '甄别申请时间',
  131. width: 170,
  132. render: (scope) => {
  133. return <span>{formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
  134. },
  135. },
  136. { prop: 'creatorName', label: '甄别申请人', width: 170 },
  137. { prop: 'creatorOrgName', label: '甄别申请部门', width: 200 },
  138. { prop: 'typeDicName', label: '甄别申请类型', width: 170 },
  139. { prop: 'content', label: '甄别申请原因', width: 200 },
  140. { prop: 'operation', label: '操作', fixed: 'right', width: 170, align: 'center' },
  141. ]);
  142. // 定义变量内容
  143. const ruleFormRef = ref<RefType>(); // 表单ref
  144. const state = reactive({
  145. queryParams: {
  146. // 查询条件
  147. PageIndex: 1,
  148. PageSize: 10,
  149. Keyword: null, // 关键字
  150. CreationTimeStart: null, // 创建时间 开始
  151. CreationTimeEnd: null, // 创建时间 结束
  152. exTime: [], // 办理期限
  153. source: '2', // 甄别列表 2
  154. },
  155. tableData: [], //表单
  156. loading: false, // 加载
  157. total: 0, // 总数
  158. screenStatus: [], // 甄别状态
  159. screenType: [], // 甄别类型
  160. });
  161. const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
  162. if (val) {
  163. state.queryParams[startKey] = val[0];
  164. state.queryParams[endKey] = val[1];
  165. } else {
  166. state.queryParams[startKey] = '';
  167. state.queryParams[endKey] = '';
  168. }
  169. handleQuery();
  170. };
  171. // 甄别时间
  172. const timeStartChangeCr = (val: string[]) => {
  173. handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
  174. };
  175. // 获取查询条件基础信息
  176. const getBaseData = async () => {
  177. const res: any = await screenBaseData();
  178. state.screenStatus = res.result?.screenStatus ?? [];
  179. state.screenType = res.result?.screenType ?? [];
  180. };
  181. // 手动查询,将页码设置为1
  182. const handleQuery = () => {
  183. state.queryParams.PageIndex = 1;
  184. queryList();
  185. };
  186. /** 获取列表 */
  187. const queryList = () => {
  188. let request = other.deepClone(state.queryParams);
  189. Reflect.deleteProperty(request, 'exTime'); // 删除无用的参数
  190. state.loading = true;
  191. screenList(request)
  192. .then((response: any) => {
  193. state.tableData = response?.result.items ?? [];
  194. state.total = response?.result.total;
  195. state.loading = false;
  196. })
  197. .catch(() => {
  198. state.loading = false;
  199. });
  200. };
  201. /** 重置按钮操作 */
  202. const resetQuery = (formEl: FormInstance | undefined) => {
  203. if (!formEl) return;
  204. formEl.resetFields();
  205. state.queryParams.CreationTimeStart = null;
  206. state.queryParams.CreationTimeEnd = null;
  207. queryList();
  208. };
  209. // 查看详情
  210. const discernDetailRef = ref<RefType>(); // 甄别详情ref
  211. const discernEditRef = ref<RefType>(); // 甄别修改ref
  212. const onDetail = async (row: any) => {
  213. try {
  214. const { result } = await screenDetail(row.id);
  215. if (result.handle) {
  216. // 退回到了开始 需要重新打开编辑页面在发起流程
  217. discernEditRef.value.openDialog(row);
  218. } else {
  219. discernDetailRef.value.openDialog(row);
  220. }
  221. } catch (e) {
  222. console.log(e);
  223. }
  224. };
  225. onMounted(async () => {
  226. await getBaseData();
  227. queryList();
  228. });
  229. </script>