index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. <template>
  2. <div class="h-full flex">
  3. <div class="p-5 w-80 pr-0">
  4. <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
  5. <div class="flex-1 p-3 overflow-y-auto scroll-bar">
  6. <el-form :model="searchForm">
  7. <el-form-item label="任务名称:" label-width="7em" prop="taskName">
  8. <el-input v-model="searchForm.taskName" placeholder="请输入" />
  9. </el-form-item>
  10. <el-form-item label="优先级:" label-width="7em" prop="priority">
  11. <el-select v-model="searchForm.priority" placeholder="请选择">
  12. <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
  13. </el-select>
  14. </el-form-item>
  15. <el-form-item label="客户名称:" label-width="7em" prop="customerName">
  16. <el-input v-model="searchForm.customerName" placeholder="请输入" />
  17. </el-form-item>
  18. <el-form-item label="联系人:" label-width="7em" prop="tel">
  19. <el-input v-model="searchForm.tel" placeholder="请输入" />
  20. </el-form-item>
  21. <el-form-item label="执行人:" label-width="7em" prop="tel">
  22. <el-select v-model="searchForm.status" placeholder="请选择">
  23. <el-option v-for="item in STATUS" :key="item.value" :value="item.value" :label="item.label" />
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="商机名称:" label-width="7em" prop="tel">
  27. <el-input v-model="searchForm.tel" placeholder="请输入" />
  28. </el-form-item>
  29. <el-form-item label="销售订单:" label-width="7em" prop="tel">
  30. <el-input v-model="searchForm.tel" placeholder="请输入" />
  31. </el-form-item>
  32. <el-form-item label="线索名称:" label-width="7em" prop="tel">
  33. <el-input v-model="searchForm.tel" placeholder="请输入" />
  34. </el-form-item>
  35. <el-form-item label="任务状态:" label-width="7em" prop="status">
  36. <el-select v-model="searchForm.status" placeholder="请选择">
  37. <el-option v-for="item in STATUS" :key="item.value" :value="item.value" :label="item.label" />
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item label="开始时间:" label-width="7em" prop="startDate">
  41. <el-date-picker v-model="searchForm.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
  42. </el-form-item>
  43. <el-form-item label="截止时间:" label-width="7em" prop="endDate">
  44. <el-date-picker v-model="searchForm.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
  45. </el-form-item>
  46. </el-form>
  47. </div>
  48. <div class="w-full flex p-3 shadow-[0_-3px_5px_0px_rgba(0,0,0,0.2)]">
  49. <el-button size="large" class="w-full" @click="reset()">重置</el-Button>
  50. <el-button type="primary" size="large" class="w-full" @click="search()">搜索</el-Button>
  51. </div>
  52. </div>
  53. </div>
  54. <div class="flex-1 p-5 overflow-auto" v-loading="loading">
  55. <div class="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
  56. <div class="ml-auto p-3">
  57. <el-button type="primary" @click="createTasks()">创建任务</el-Button>
  58. <el-button type="primary" :loading="btnLoading" @click="deleteTasks()">批量删除</el-Button>
  59. <el-button type="primary" @click="openImportModal()">导入</el-Button>
  60. <el-button type="primary" :loading="btnLoading" @click="exportTasks()">导出</el-Button>
  61. </div>
  62. <div class="flex-1">
  63. <el-table :data="tableData" style="width: 100%;height: 100%;" ref="tableRef">
  64. <el-table-column type="selection" width="55" />
  65. <el-table-column prop="taskName" label="任务名称" header-align="center" align="center" show-overflow-tooltip
  66. width="200" />
  67. <el-table-column prop="priority" label="优先级" width="90" :sortable="true" header-align="center"
  68. align="center">
  69. <template #default="scope">
  70. {{ PRIORITY.find(item => item.value == scope.row.priority)?.label }}
  71. </template>
  72. </el-table-column>
  73. <el-table-column prop="status" label="状态" width="100" header-align="center" align="center">
  74. <template #default="scope">
  75. <el-text :type="STATUS[scope.row.status]?.type">
  76. {{ STATUS[scope.row.status]?.label }}
  77. </el-text>
  78. </template>
  79. </el-table-column>
  80. <el-table-column prop="customerName" label="执行人" width="120" header-align="center" align="center" />
  81. <el-table-column prop="startDate" label="开始时间" width="120" :sortable="true" header-align="center"
  82. align="center" />
  83. <el-table-column prop="endDate" label="截止时间" width="120" :sortable="true" header-align="center"
  84. align="center" />
  85. <el-table-column prop="contactsName" label="联系人" header-align="center" align="center" width="120" />
  86. <el-table-column prop="contactsTel" label="联系人号码" header-align="center" align="center" width="140" />
  87. <el-table-column prop="customerName" label="客户名称" header-align="center" align="center" width="120" />
  88. <el-table-column prop="businessName" label="商机名称" header-align="center" align="center" width="200" />
  89. <el-table-column prop="businessName" label="销售订单" header-align="center" align="center" width="200" />
  90. <el-table-column prop="businessName" label="线索名称" header-align="center" align="center" width="200" />
  91. <el-table-column fixed="right" label="操作" header-align="center" align="center" width="150">
  92. <template #default="scope">
  93. <el-button link type="primary" size="small" @click.prevent="editRow(scope.row)">
  94. 编辑
  95. </el-button>
  96. <el-button link type="primary" size="small" v-if="scope.row.status == '3'"
  97. @click.prevent="restart(scope.$index)">
  98. 重启
  99. </el-button>
  100. <el-button link type="primary" size="small" v-else @click.prevent="finishRow(scope.$index, scope)">
  101. 完成
  102. </el-button>
  103. <el-button link type="danger" size="small" @click.prevent="deleteRow(scope.$index)">
  104. 删除
  105. </el-button>
  106. </template>
  107. </el-table-column>
  108. </el-table>
  109. </div>
  110. <div class="ml-auto">
  111. <el-pagination layout="total, prev, pager, next, sizes" :total="totalCount"
  112. :current-page="searchForm.pageIndex" hide-on-single-page @size-change="sizeChage"
  113. @current-change="currentChange" />
  114. </div>
  115. </div>
  116. </div>
  117. <TaskModal :visible="taskModalVisible" :save-loading="taskLoading" :edit-form="taskForm" @close="closeTaskModal"
  118. @submit="submitForm" />
  119. <ImportModal :visible="importVisible" :save-loading="importLoading" @close="closeImportModal"
  120. @submit="importExcel" />
  121. <ExportModal :visible="exportVisible" :save-loading="exportLoading" @close="closeExportModal"
  122. @submit="exportExcel" />
  123. </div>
  124. </template>
  125. <script lang="ts" setup>
  126. import { inject, onBeforeMount, onMounted, ref } from 'vue';
  127. import { useStore } from '@/store';
  128. import { MOD, PRIORITY, STATUS, defaultSearchForm, PAGE_LIST } from './api';
  129. import { dayjs, ElTable } from 'element-plus';
  130. import TaskModal from '@/components/TaskModal/index.vue';
  131. import ImportModal from './ImportModal.vue';
  132. import ExportModal from './ExportModal.vue';
  133. import { post, uploadFile } from '@/utils/request';
  134. import { getFromValue } from '@/utils/tools';
  135. const { getFunctionList } = useStore()
  136. const globalPopup = inject<GlobalPopup>('globalPopup')
  137. const pagePermission = ref<any[]>();
  138. const taskModalVisible = ref(false);
  139. const taskForm = ref<any>();
  140. const taskLoading = ref<saveLoadingType>("1");
  141. function closeTaskModal() {
  142. taskModalVisible.value = false;
  143. taskForm.value = null;
  144. }
  145. function submitForm(data: any, isClose: boolean) {
  146. const { executorId } = data;
  147. console.log("原有的数据", data, isClose);
  148. let params = {
  149. ...data
  150. }
  151. if (executorId) {
  152. params = {
  153. ...params,
  154. executorId: executorId.join(',')
  155. }
  156. }
  157. console.log("提交的数据水水水水", params, isClose);
  158. taskLoading.value = "2";
  159. setTimeout(() => {
  160. taskLoading.value = "3";
  161. taskModalVisible.value = isClose;
  162. }, 2000)
  163. }
  164. const searchForm = ref<any>();
  165. const tableRef = ref<InstanceType<typeof ElTable>>();
  166. const loading = ref<boolean>(false);
  167. const totalCount = ref<number>(0);
  168. const tableData = ref<any[]>([
  169. {
  170. taskName: '任务1111111111111111111111111',
  171. contactsTel: "15100111111",
  172. contactsName: "水水水水",
  173. customerName: '李四',
  174. status: 0,
  175. priority: 0,
  176. executorId: [1, 2], //执行人id
  177. startDate: dayjs().format('YYYY-MM-DD'),
  178. endDate: dayjs().format('YYYY-MM-DD'),
  179. repeat:1,
  180. taskType: 1,
  181. endType: 1,
  182. taskDesc: "任务秒数",
  183. repeatType:4,
  184. repeatDesignDay: "1,4,3,4",
  185. taskLogs: [
  186. {
  187. id: 3,
  188. modTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  189. userName: '张三',
  190. content: '删除任务'
  191. },
  192. {
  193. id: 2,
  194. modTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  195. operateType: '2',
  196. userName: '张三',
  197. content: '修改任务'
  198. }, {
  199. id: 1,
  200. modTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  201. operateType: '1',
  202. userName: '张三',
  203. content: '创建任务'
  204. }
  205. ]
  206. },
  207. {
  208. taskName: '任务222',
  209. customerName: '张三',
  210. status: '1',
  211. priority: '1',
  212. startDate: dayjs().format('YYYY-MM-DD'),
  213. endDate: dayjs().format('YYYY-MM-DD'),
  214. taskType: '2'
  215. },
  216. {
  217. taskName: '任务333',
  218. customerName: '王五',
  219. status: '2',
  220. priority: '2',
  221. startDate: dayjs().format('YYYY-MM-DD'),
  222. endDate: dayjs().format('YYYY-MM-DD'),
  223. taskType: '0'
  224. },
  225. {
  226. taskName: '任务444',
  227. customerName: '赵六',
  228. status: '3',
  229. priority: '1',
  230. startDate: dayjs().format('YYYY-MM-DD'),
  231. endDate: dayjs().format('YYYY-MM-DD'),
  232. taskType: '3'
  233. },
  234. {
  235. taskName: '任务555',
  236. customerName: '马六',
  237. status: '1',
  238. priority: '2',
  239. startDate: dayjs().format('YYYY-MM-DD'),
  240. endDate: dayjs().format('YYYY-MM-DD'),
  241. },
  242. {
  243. taskName: '任务666',
  244. customerName: '吴七',
  245. status: '3',
  246. priority: '0',
  247. startDate: dayjs().format('YYYY-MM-DD'),
  248. endDate: dayjs().format('YYYY-MM-DD'),
  249. },
  250. {
  251. taskName: '任务777',
  252. customerName: '钱八',
  253. status: '0',
  254. priority: '1',
  255. startDate: dayjs().format('YYYY-MM-DD'),
  256. endDate: dayjs().format('YYYY-MM-DD'),
  257. }
  258. ])
  259. function search() {
  260. loading.value = true;
  261. post(PAGE_LIST, getFromValue(searchForm.value)).then(({ data }) => {
  262. loading.value = false;
  263. const { total, record } = data;
  264. totalCount.value = total;
  265. // tableData.value = record;
  266. }).catch(err => {
  267. console.log("err", err);
  268. loading.value = false;
  269. })
  270. }
  271. function reset() {
  272. searchForm.value = { ...defaultSearchForm };
  273. }
  274. function sizeChage(currentSize: number): void {
  275. console.log("object", currentSize);
  276. searchForm.value = {
  277. ...searchForm.value,
  278. pageSize: currentSize,
  279. pageIndex: 1
  280. }
  281. search()
  282. }
  283. function currentChange(currentPage: number): void {
  284. console.log("object", currentPage);
  285. searchForm.value = {
  286. ...searchForm.value,
  287. pageIndex: currentPage
  288. }
  289. search()
  290. }
  291. function createTasks() {
  292. taskModalVisible.value = true;
  293. taskForm.value = null;
  294. }
  295. function deleteTasks() {
  296. console.log("deleteTasks", searchForm.value);
  297. console.log(dayjs().format('YYYY-MM-DD'));
  298. }
  299. const importVisible = ref(false);
  300. const importLoading = ref<saveLoadingType>("1");
  301. function openImportModal() {
  302. importVisible.value = true;
  303. }
  304. function closeImportModal() {
  305. importVisible.value = false;
  306. }
  307. function importExcel(data: any) {
  308. console.log("需要提交的数据,importExcel", data);
  309. return
  310. const formData = new FormData();
  311. formData.append("file", data);
  312. formData.append("projectId", "32277");
  313. importLoading.value = "2";
  314. uploadFile("/document/uploadDocument", formData).then(_res => {
  315. globalPopup?.showSuccess("导入成功")
  316. importLoading.value = "3";
  317. }).catch(err => {
  318. globalPopup?.showError(err)
  319. importLoading.value = "4";
  320. })
  321. }
  322. const exportVisible = ref(false);
  323. const exportLoading = ref<saveLoadingType>("1");
  324. const btnLoading = ref(false);
  325. function exportTasks() {
  326. const data = tableRef.value?.getSelectionRows()
  327. if (data.length === 0) {
  328. // TODO
  329. exportVisible.value = true;
  330. return
  331. }
  332. btnLoading.value = true;
  333. setTimeout(() => {
  334. btnLoading.value = false;
  335. }, 2000)
  336. }
  337. function closeExportModal() {
  338. exportVisible.value = false;
  339. }
  340. function exportExcel(data: any) {
  341. console.log("export", data);
  342. exportLoading.value = "2";
  343. setTimeout(() => {
  344. exportLoading.value = "3";
  345. exportVisible.value = false;
  346. }, 2000)
  347. }
  348. function editRow(row: any) {
  349. taskModalVisible.value = true;
  350. taskForm.value = row;
  351. }
  352. function finishRow(index: any, scope: any) {
  353. console.log("finishRow", index, scope);
  354. }
  355. function restart(index: any) {
  356. console.log("restart", index);
  357. }
  358. function deleteRow(index: any) {
  359. console.log("deleteRow", index);
  360. }
  361. onBeforeMount(() => {
  362. pagePermission.value = getFunctionList(MOD);
  363. searchForm.value = { ...defaultSearchForm };
  364. })
  365. onMounted(() => {
  366. search()
  367. })
  368. </script>
  369. <style lang="scss" scoped></style>