index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <template>
  2. <div class="page-container list-container">
  3. <!-- 功能按钮区 -->
  4. <div class="list-btns-container">
  5. <el-dropdown>
  6. <el-button type="primary" size="small">
  7. 其它<el-icon class="el-icon--right"><arrow-down /></el-icon>
  8. </el-button>
  9. <template #dropdown>
  10. <el-dropdown-menu>
  11. <el-dropdown-item
  12. icon="Download"
  13. @click="handleExport"
  14. v-hasPermi="['business:deposit:export']"
  15. >
  16. 导出</el-dropdown-item
  17. >
  18. <!-- <el-dropdown-item type="warning" size="small" icon="Download" @click="handleArea"
  19. v-hasPermi="['business:deposit:export']"> area</el-dropdown-item> -->
  20. </el-dropdown-menu>
  21. </template>
  22. </el-dropdown>
  23. <!-- <el-button type="warning" size="small" icon="Download" @click="handleExport"
  24. v-hasPermi="['business:deposit:export']">导出</el-button> -->
  25. <!--<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>-->
  26. </div>
  27. <!-- 搜索区 -->
  28. <el-form
  29. class="list-search-container"
  30. size="small"
  31. :model="queryParams"
  32. ref="queryRef"
  33. :inline="true"
  34. label-width="78px"
  35. >
  36. <el-form-item>
  37. <el-radio-group
  38. v-model="queryRadio"
  39. size="small"
  40. @change="radioChangeHandler"
  41. >
  42. <el-radio-button label="全部" />
  43. <el-radio-button label="流转反馈" />
  44. <el-radio-button label="驳回反馈" />
  45. </el-radio-group>
  46. </el-form-item>
  47. <el-form-item label="客户名称:" prop="companyName">
  48. <el-input
  49. v-model="queryParams.companyName"
  50. style="width: 150px"
  51. placeholder="请输入客户名称"
  52. clearable
  53. @keyup.enter="handleQuery"
  54. />
  55. </el-form-item>
  56. <el-form-item v-if="tenant.versionId !== '4'" label="是否自己负责:">
  57. <el-switch v-model="oneself" @change="handleOneself" />
  58. </el-form-item>
  59. <el-form-item>
  60. <el-button type="primary" icon="Search" @click="handleQuery"
  61. >搜索</el-button
  62. >
  63. <el-button icon="operation" @click="moreSearch = true">更多</el-button>
  64. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  65. </el-form-item>
  66. </el-form>
  67. <!-- 列表区 -->
  68. <el-table
  69. v-loading="loading"
  70. :data="list"
  71. size="small"
  72. border
  73. height="100%"
  74. @selection-change="handleSelectionChange"
  75. >
  76. <el-table-column type="selection" width="55" align="center" />
  77. <!-- <el-table-column
  78. align="center"
  79. type="index"
  80. label="序号"
  81. width="50"
  82. ></el-table-column> -->
  83. <el-table-column
  84. label="客户名称"
  85. prop="companyName"
  86. min-width="250"
  87. align="center"
  88. />
  89. <el-table-column
  90. label="来源"
  91. min-width="90"
  92. align="center"
  93. prop="fromCompanyName"
  94. />
  95. <el-table-column
  96. label="纳税性质"
  97. prop="taxType"
  98. align="center"
  99. min-width="90"
  100. />
  101. <el-table-column
  102. label="收票月份"
  103. prop="provinceCode"
  104. min-width="80"
  105. align="center"
  106. >
  107. <template #default="scope">
  108. <span>{{ scope.row.year + "-" + scope.row.month }}</span>
  109. </template>
  110. </el-table-column>
  111. <el-table-column
  112. label="反馈信息"
  113. prop="remark"
  114. min-width="150"
  115. align="center"
  116. />
  117. <el-table-column
  118. label="回复信息"
  119. prop="feedbackContent"
  120. min-width="150"
  121. align="center"
  122. />
  123. <el-table-column
  124. label="回复时间"
  125. prop="feedbackTime"
  126. min-width="80"
  127. align="center"
  128. />
  129. <el-table-column label="操作" fixed="right" width="80" align="center">
  130. <template #default="scope">
  131. <el-button
  132. v-show="scope.row.status === 1"
  133. link
  134. type="warning"
  135. size="small"
  136. v-hasPermi="['business:archiveReceiveTicket:edit']"
  137. @click="handleInfo(scope.row)"
  138. >回复</el-button
  139. >
  140. <span v-if="scope.row.status !== 1">--</span>
  141. </template>
  142. </el-table-column>
  143. </el-table>
  144. <!-- <Deposit-form ref="DepositRef" :get-list="getList" /> -->
  145. <el-dialog
  146. title="反馈回复"
  147. width="500px"
  148. v-model="formOpen"
  149. append-to-body
  150. draggable
  151. @close="formCancel"
  152. >
  153. <el-form ref="dictRef" :model="form" label-width="100" size="small">
  154. <el-row :gutter="30">
  155. <el-col :span="24">
  156. <el-form-item label="回复信息:">
  157. <el-input
  158. v-if="form.status === 1"
  159. v-model.trim="form.feedbackContent"
  160. size="small"
  161. type="textarea"
  162. maxlength="200"
  163. show-word-limit
  164. placeholder="请输入回复信息"
  165. :clearable="true"
  166. />
  167. <div v-else>{{ form.feedbackContent }}</div>
  168. </el-form-item>
  169. </el-col>
  170. </el-row>
  171. </el-form>
  172. <template #footer>
  173. <div class="dialog-footer">
  174. <el-button
  175. type="primary"
  176. icon="Finished"
  177. size="small"
  178. @click="saveHandler"
  179. >确 定</el-button
  180. >
  181. <el-button icon="close" size="small" @click="formCancel"
  182. >取 消</el-button
  183. >
  184. </div>
  185. </template>
  186. </el-dialog>
  187. <!-- 分页 -->
  188. <pagination
  189. v-show="total > 0"
  190. :total="total"
  191. v-model:page="queryParams.pageNum"
  192. v-model:limit="queryParams.pageSize"
  193. @pagination="getList"
  194. />
  195. <el-image-viewer
  196. v-if="showViewer"
  197. :url-list="currentFileList"
  198. @close="closeImages"
  199. :initial-index="showIndex"
  200. />
  201. <!-- 更多搜索弹窗 -->
  202. <el-dialog
  203. title="更多搜索"
  204. v-model="moreSearch"
  205. width="620px"
  206. size="small"
  207. append-to-body
  208. draggable
  209. >
  210. <el-form :model="queryParams" ref="queryRef" label-width="100">
  211. <el-row :gutter="20">
  212. <el-col :span="12">
  213. <el-form-item label="反馈月份:" prop="feedbackMonth">
  214. <el-date-picker
  215. v-model="feedbackMonth"
  216. size="small"
  217. :clearable="true"
  218. value-format="YYYY-MM"
  219. format="YYYY-MM"
  220. type="month"
  221. />
  222. </el-form-item>
  223. <el-form-item label="纳税性质:" prop="taxType">
  224. <el-select
  225. size="small"
  226. v-model="queryParams.taxType"
  227. placeholder="请选择纳税性质"
  228. :clearable="true"
  229. @change="taxTypeChange"
  230. >
  231. <el-option
  232. v-for="item in taxTypes"
  233. :key="item.label"
  234. :label="item.label"
  235. :value="item.value"
  236. />
  237. </el-select>
  238. </el-form-item>
  239. </el-col>
  240. <el-col :span="12">
  241. <el-form-item label="来源:" prop="fromCompanyName">
  242. <el-input
  243. size="small"
  244. v-model="queryParams.fromCompanyName"
  245. type="text"
  246. placeholder="客户来源"
  247. :clearable="true"
  248. />
  249. </el-form-item>
  250. </el-col>
  251. </el-row>
  252. </el-form>
  253. <template #footer>
  254. <div class="dialog-footer">
  255. <el-button
  256. type="primary"
  257. icon="Finished"
  258. size="small"
  259. @click="handleQuery"
  260. >确 定</el-button
  261. >
  262. <el-button icon="close" size="small" @click="moreSearch = false"
  263. >取 消</el-button
  264. >
  265. </div>
  266. </template>
  267. </el-dialog>
  268. </div>
  269. </template>
  270. <script setup name="Company">
  271. // import contractForm from "./form";
  272. import {
  273. listReceiveTicketFeedback,
  274. delReceiveTicketFeedback,
  275. exportReceiveTicketFeedback,
  276. addReceiveTicketFeedback,
  277. getReceiveTicketFeedback,
  278. updateReceiveTicketFeedback,
  279. } from "@/api/business/production/receiveTicketFeedback";
  280. import { taxTypes } from "@/utils/default";
  281. import useUserStore from "@/store/modules/user";
  282. // import ElImageViewer from 'element-plus/lib/components/image-viewer';
  283. import { uploadFile } from "@/api/tool/file";
  284. import { listCompany } from "@/api/business/crm/company";
  285. import { ref } from "vue";
  286. // import DepositForm from "./form"
  287. const { proxy } = getCurrentInstance();
  288. /** 字典数组区 */
  289. /** 查询 对象 */
  290. const tenant = useUserStore().tenant;
  291. const list = ref([]);
  292. const loading = ref(true);
  293. const oneself = ref(false);
  294. const ids = ref([]);
  295. const single = ref(true);
  296. const multiple = ref(true);
  297. const moreSearch = ref(false);
  298. const feedbackMonth = ref(null);
  299. const total = ref(0);
  300. const prev = ref([]);
  301. const baseUrl = ref(import.meta.env.VITE_APP_BASE_API);
  302. const showViewer = ref(false);
  303. const currentFileList = ref([]);
  304. const showIndex = ref(0);
  305. const queryRadio = ref("全部");
  306. const formOpen = ref(false);
  307. const form = ref({
  308. id: null,
  309. companyName: "",
  310. companyId: null,
  311. remark: "",
  312. type: 1,
  313. files: [],
  314. });
  315. const emptyForm = {
  316. id: null,
  317. companyName: "",
  318. companyId: null,
  319. type: 1,
  320. remark: "",
  321. files: [],
  322. };
  323. const { verify_status } = proxy.useDict("verify_status");
  324. /** 查询对象 */
  325. const queryParams = ref({
  326. pageNum: 1,
  327. pageSize: 20,
  328. fromCompanyName: "",
  329. orderByColumn: "create_time",
  330. companyName: "",
  331. noContract: 1,
  332. });
  333. /*********************** 方法区 ****************************/
  334. /** 查询company列表 */
  335. function getList() {
  336. loading.value = true;
  337. listReceiveTicketFeedback(queryParams.value).then((response) => {
  338. list.value = response.rows.map((l) => ({ ...l }));
  339. prev.value = proxy.deepClone(response.rows);
  340. total.value = response.total;
  341. loading.value = false;
  342. });
  343. }
  344. /** 是否为自己负责 */
  345. function handleOneself() {
  346. if (oneself.value) {
  347. queryParams.value.principal = useUserStore().user.userId;
  348. } else {
  349. queryParams.value.principal = null;
  350. }
  351. getList();
  352. }
  353. /** 搜索按钮操作 */
  354. function handleQuery() {
  355. if (feedbackMonth.value != null) {
  356. queryParams.value.year = feedbackMonth.value.substr(0, 4);
  357. queryParams.value.month = feedbackMonth.value.substr(5);
  358. }
  359. queryParams.value.pageNum = 1;
  360. getList();
  361. moreSearch.value = false;
  362. }
  363. /** 重置按钮操作 */
  364. function resetQuery() {
  365. queryParams.value = {
  366. pageNum: 1,
  367. pageSize: 20,
  368. orderByColumn: "create_time",
  369. companyName: "",
  370. noContract: 1,
  371. };
  372. feedbackMonth.value = null;
  373. handleQuery();
  374. }
  375. // 多选框选中数据
  376. function handleSelectionChange(selection) {
  377. ids.value = selection.map((item) => item.id);
  378. single.value = selection.length != 1;
  379. multiple.value = !selection.length;
  380. }
  381. function formCancel() {
  382. formOpen.value = false;
  383. reset();
  384. }
  385. function reset() {
  386. form.value = proxy.deepClone(emptyForm);
  387. }
  388. /** 修改按钮操作 */
  389. function handleUpdate(row) {
  390. // const id = row.id || ids.value;
  391. // proxy.$refs.DepositRef.open(id);
  392. }
  393. /** 删除按钮操作 */
  394. function handleDelete(row) {
  395. const _ids = row.id || ids.value;
  396. proxy.$modal
  397. .confirm("是否确认删除选中的数据项?")
  398. .then(function () {
  399. return delReceiveTicketFeedback(_ids);
  400. })
  401. .then(() => {
  402. getList();
  403. proxy.$modal.msgSuccess("删除成功!");
  404. })
  405. .catch(() => {});
  406. }
  407. /** 导出按钮操作 */
  408. function handleExport() {
  409. exportReceiveTicketFeedback(queryParams.value);
  410. }
  411. function saveHandler() {
  412. if (form.value.feedbackContent == null || form.value.feedbackContent === "") {
  413. proxy.$modal.msgError("请输入回复信息");
  414. return;
  415. }
  416. if (form.value.id == null) {
  417. addReceiveTicketFeedback(form.value).then((res) => {
  418. formCancel();
  419. getList();
  420. });
  421. } else {
  422. form.value.status = 2;
  423. updateReceiveTicketFeedback(form.value).then((res) => {
  424. formCancel();
  425. getList();
  426. });
  427. }
  428. }
  429. function upload(param) {
  430. const formData = new FormData();
  431. formData.append("file", param.file);
  432. uploadFile(formData).then((res) => {
  433. if (res.code === 200) {
  434. const file = {};
  435. file.fileName = res.newFileName;
  436. file.url = res.url;
  437. file.originalFileName = res.originalFilename;
  438. file.fileUrl = res.fileName;
  439. form.value.files.push(file);
  440. }
  441. });
  442. }
  443. function openFollowFile(arg) {
  444. // console.log(arg)
  445. const attach = arg;
  446. window.open(`${arg.url}`, arg.fileName);
  447. }
  448. function showFileList(row) {
  449. currentFileList.value = row.files.map((l) => `${baseUrl.value}${l.fileUrl}`);
  450. showViewer.value = true;
  451. }
  452. function closeImages() {
  453. showViewer.value = false;
  454. }
  455. function handleInfo(row) {
  456. formOpen.value = true;
  457. getForm(row.id);
  458. }
  459. function getForm(id) {
  460. getReceiveTicketFeedback(id).then((res) => {
  461. form.value = res.data;
  462. if (form.value == null) {
  463. reset();
  464. }
  465. });
  466. }
  467. function handleDelFile(index) {
  468. form.value.files.splice(index, 1);
  469. }
  470. function radioChangeHandler(arg) {
  471. const query = {
  472. // mainAccountSetsId: store.getters.accountSets.id,
  473. total: 0,
  474. pageSize: 20,
  475. pageNum: 1,
  476. };
  477. switch (arg) {
  478. case "全部":
  479. query.needSync = null;
  480. break;
  481. case "流转反馈":
  482. // query.isFinished = true
  483. query.needSync = 0;
  484. break;
  485. case "驳回反馈":
  486. query.needSync = 1;
  487. break;
  488. default:
  489. break;
  490. }
  491. queryParams.value = query;
  492. handleQuery();
  493. }
  494. function edit(row) {}
  495. getList();
  496. </script>