index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <template>
  2. <div class="card-search">
  3. <a-form
  4. ref="formRef"
  5. name="advanced_search"
  6. class="ant-advanced-search-form"
  7. :model="searchParamsState"
  8. >
  9. <a-row :gutter="24">
  10. <a-col :span="6">
  11. <a-form-item label="姓名" :label-col="{ span: 8 }" name="name">
  12. <a-input v-model:value="searchParamsState.name" placeholder="" :allow-clear="true" />
  13. </a-form-item>
  14. </a-col>
  15. <a-col :span="6">
  16. <a-form-item label="所属县区" :label-col="{span:8}" name="regionCode">
  17. <a-select
  18. ref="select"
  19. v-model:value="searchParamsState.regionCode"
  20. :options="regionList"
  21. :field-names="{ label: 'name', value: 'code' }"
  22. :allow-clear="true"
  23. @change="regionChange"
  24. >
  25. </a-select>
  26. </a-form-item>
  27. </a-col>
  28. <a-col :span="6">
  29. <a-form-item label="所属驿站" :label-col="{ span: 8 }" name="siteID">
  30. <a-select
  31. ref="select"
  32. v-model:value="searchParamsState.siteID"
  33. :options="siteList"
  34. :field-names="{ label: 'siteName', value: 'siteID' }"
  35. :allow-clear="true"
  36. @change="loadData"
  37. >
  38. </a-select>
  39. </a-form-item>
  40. </a-col>
  41. <a-col :span="6" style="text-align: center;">
  42. <a-button type="primary" html-type="submit" @click="onFinish">查询</a-button>
  43. </a-col>
  44. </a-row>
  45. <a-row :gutter="24" >
  46. <a-col :span="6">
  47. <a-form-item label="外出类型" :label-col="{ span: 8 }" name="signinType">
  48. <a-select
  49. ref="select"
  50. v-model:value="searchParamsState.signinType"
  51. :options="signinTypeList"
  52. :field-names="{ label: 'name', value: 'value' }"
  53. :allow-clear="true"
  54. @change="loadData"
  55. >
  56. </a-select>
  57. </a-form-item>
  58. </a-col>
  59. <a-col :span="6">
  60. <a-form-item label="外出时间" :label-col="{ span: 8 }" name="signinDate">
  61. <a-range-picker v-model:value="signinDate" :placeholder="['开始日期', '结束日期']" format="YYYY-MM-DD"
  62. @change="onCreateTimeChange"/>
  63. </a-form-item>
  64. </a-col>
  65. <a-col :span="6">
  66. </a-col>
  67. <a-col :span="6" style="text-align: center;">
  68. <BExportExcel :title="'导出'" :filename="'企业信息'"
  69. :url="'jobusermgr/signinMgt/export'"
  70. :params="{...exportSearchParams, isExport: true, rows:10000,signinIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
  71. </a-col>
  72. </a-row>
  73. </a-form>
  74. <div class="search-result-list">
  75. <a-table
  76. :columns="columns"
  77. :data-source="dataList"
  78. :scroll="{ x: '100%', y: 500 }"
  79. :pagination="pagination"
  80. :loading="formState.loading"
  81. :row-selection="{ selectedRowKeys: formState.selectedRowKeys, onChange: onSelectChange }"
  82. :row-key="(record) => record.signinId"
  83. bordered
  84. @change="handleTableChange"
  85. >
  86. <template #bodyCell="{ column, text, record }">
  87. <template v-if="column.key === 'operation'">
  88. <div class="table-operation">
  89. <a-button type="link" size="small" functioncode="T01030502"
  90. @click='onEdit(record)'>修改
  91. </a-button>
  92. <a-button type="link" size="small" functioncode="T01030503"
  93. @click='onDel(record)'>删除
  94. </a-button>
  95. <a-button type="link" size="small" functioncode="T01030504"
  96. @click='onForward(record)'>跟进
  97. </a-button>
  98. </div>
  99. </template>
  100. </template>
  101. </a-table>
  102. </div>
  103. </div>
  104. </template>
  105. <script lang="ts">
  106. import {reactive, ref, computed, defineComponent, createVNode} from 'vue';
  107. import type {FormInstance, TableProps, SelectProps} from 'ant-design-vue';
  108. import {getList,del} from "@/api/jobUserManager/signinMgt";
  109. import {getSysDictionaryList} from '@/api/system/dictionary';
  110. import {getPaginationTotalTitle} from '@/utils/common';
  111. import dayjs from "dayjs";
  112. import {getSiteList} from "@/api/baseSettings/siteInfo";
  113. import {get} from "@/api/common";
  114. import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
  115. import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
  116. import {message, Modal} from "ant-design-vue";
  117. import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
  118. import {useTabsViewStore} from "@/store/modules/tabsView";
  119. export default defineComponent({
  120. name: 'recommendMgtList',
  121. components: {ColumnsSetting, BExportExcel},
  122. setup() {
  123. const expand = ref(false);
  124. const modalRoleUserRef = ref();
  125. const modalRoleEditRef = ref();
  126. const modalAddRemarkRef = ref();
  127. const formRef = ref<FormInstance>();
  128. const searchParamsState = reactive({
  129. pageIndex: 1,
  130. pageSize: 20,
  131. name: '',
  132. siteID: null,
  133. regionCode: null,
  134. signinType: null,
  135. startDate: null,
  136. endDate: null
  137. });
  138. const exportSearchParams = computed(() => {
  139. let data = JSON.parse(JSON.stringify(searchParamsState));
  140. data.pageSize = formState.total;
  141. return data;
  142. })
  143. const formState = reactive({
  144. total: 0,
  145. selectedRowKeys: [],
  146. loading: false,
  147. });
  148. // 原始表格定义数据
  149. const originalColumns = [
  150. {
  151. title: '序号',
  152. align: 'center',
  153. width: 80,
  154. key: 'recommendMgtID',
  155. customRender: (item) =>
  156. `${searchParamsState.pageSize * (searchParamsState.pageIndex - 1) + item.index + 1}`, isDisabled: true
  157. },
  158. {title: '外出人员', dataIndex: 'signinerName', key: 'signinerName', align: "center"},
  159. {
  160. title: '外出时间', dataIndex: 'signinTime', key: 'signinTime', align: "center",
  161. customRender: ({record}) => dayjs(record.signinTime).format('YYYY-MM-DD HH:mm')
  162. },
  163. {title: '所属县区', dataIndex: 'regionName', key: 'regionName', align: "center"},
  164. {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
  165. {title: '外出类型', dataIndex: 'signinTypeName', key: 'signinTypeName', align: "center"},
  166. {title: '走访企业', dataIndex: 'companyName', key: 'companyName', align: "center"},
  167. {title: '走访人员', dataIndex: 'jobUserName', key: 'jobUserName', align: "center"},
  168. {title: '走访内容', dataIndex: 'content', width:300, key: 'content', align: "center", isDefaultClose: false},
  169. {title: '操作', key: 'operation', width: 150, align: 'center', isDisabled: true, isDefaultClose: true},
  170. ];
  171. // 响应式表格定义
  172. const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
  173. const siteList = ref<Array<any>>([]);
  174. const regionList = ref<SelectProps['options']>();
  175. const signinDate = ref([]);
  176. const pagination = computed(() => ({
  177. total: formState.total,
  178. current: searchParamsState.pageIndex,
  179. pageSize: searchParamsState.pageSize,
  180. showSizeChanger: true,
  181. showTotal: (total) => getPaginationTotalTitle(total),
  182. }));
  183. const dataList = ref([]);
  184. const signinTypeList = ref<SelectProps['options']>();
  185. const onSelectChange = (selectedRowKeys: any) => {
  186. formState.selectedRowKeys = selectedRowKeys;
  187. };
  188. const handleTableChange: TableProps['onChange'] = (pag: {
  189. pageSize: number;
  190. current: number;
  191. }) => {
  192. searchParamsState.pageIndex = pag.current;
  193. searchParamsState.pageSize = pag.pageSize;
  194. loadData();
  195. };
  196. const onFinish = () => {
  197. loadData();
  198. };
  199. const tabsViewStore = useTabsViewStore();
  200. const onEdit = (item: any) => {
  201. tabsViewStore.addTabByPath('/jobusermgr/signinMgt/edit', {id: item.signinId});
  202. };
  203. const onDel = (item: any) => {
  204. formState.selectedRowKeys = [];
  205. if (item) {
  206. formState.selectedRowKeys.push(item.signinId as never)
  207. }
  208. if (formState.selectedRowKeys.length <= 0) {
  209. message.warning('请选择需要删除的数据!');
  210. return false;
  211. }
  212. Modal.confirm({
  213. title: '确认删除选择的外出服务信息?',
  214. icon: createVNode(ExclamationCircleOutlined),
  215. content: '',
  216. okText: '确认删除',
  217. okType: 'danger',
  218. okButtonProps: {},
  219. cancelText: '取消',
  220. onOk() {
  221. del(formState.selectedRowKeys).then(() => {
  222. loadData();
  223. });
  224. },
  225. onCancel() {
  226. formState.selectedRowKeys = [];
  227. },
  228. })
  229. }
  230. const onForward = (item:any) =>{
  231. console.log(item)
  232. }
  233. function getAllSites() {
  234. getSiteList({pageIndex: 1, pageSize: 9999}).then((result: any) => {
  235. if(searchParamsState.regionCode!=""&& searchParamsState.regionCode!=null){
  236. result.list = result.list.filter(x=> x.regionCode == searchParamsState.regionCode);
  237. }
  238. siteList.value = result.list;
  239. });
  240. }
  241. function regionChange() {
  242. siteList.value = [];
  243. getAllSites();
  244. loadData();
  245. }
  246. function getAllRegion() {
  247. get('system/area/getCityList', {}).then(data => {
  248. regionList.value = data;
  249. });
  250. }
  251. const loadData = async function () {
  252. formState.loading = true;
  253. const result: any = await getList(searchParamsState);
  254. dataList.value = result.list;
  255. formState.total = result.total;
  256. formState.loading = false;
  257. };
  258. const theModalClosed = (d) => {
  259. if (d) {
  260. loadData();
  261. }
  262. }
  263. const getSigninTypeList = () => {
  264. getSysDictionaryList('SigninType').then((data) => {
  265. signinTypeList.value = data;
  266. });
  267. };
  268. const onCreateTimeChange = (dateString) => {
  269. signinDate.value = dateString;
  270. searchParamsState.startDate = dateString ? dateString[0].format("YYYY-MM-DD") : '';
  271. searchParamsState.endDate = dateString ? dateString[1].format("YYYY-MM-DD") : '';
  272. loadData();
  273. }
  274. function columnsCheckSub(columnsKeys: Array<string>) {
  275. columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
  276. }
  277. return {
  278. modalRoleUserRef,
  279. modalRoleEditRef,
  280. modalAddRemarkRef,
  281. formRef,
  282. loadData,
  283. searchParamsState,
  284. exportSearchParams,
  285. formState,
  286. columns,
  287. originalColumns,
  288. columnsCheckSub,
  289. pagination,
  290. dataList,
  291. signinTypeList,
  292. theModalClosed,
  293. onSelectChange,
  294. handleTableChange,
  295. onFinish,
  296. getSigninTypeList,
  297. expand,
  298. siteList,
  299. regionList,
  300. getAllSites,
  301. getAllRegion,
  302. signinDate,
  303. regionChange,
  304. onCreateTimeChange,
  305. onEdit,
  306. onDel,
  307. onForward
  308. };
  309. },
  310. created() {
  311. this.loadData();
  312. this.getSigninTypeList();
  313. this.getAllSites();
  314. this.getAllRegion();
  315. },
  316. activated() {
  317. if (history.state.params?.reload) this.loadData();
  318. },
  319. });
  320. </script>
  321. <style lang="less" scoped></style>