index.vue 8.5 KB

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