index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. <template>
  2. <div class="page-container list-container">
  3. <!-- 功能按钮区 -->
  4. <div class="list-btns-container">
  5. <el-button type="success" size="small" icon="Refresh" @click="getList"
  6. v-hasPermi="['business:entrustOrder:remove']">刷新</el-button>
  7. <el-dropdown trigger="click">
  8. <el-button type="primary" size="small">
  9. 其它<el-icon class="el-icon--right"><arrow-down /></el-icon>
  10. </el-button>
  11. <template #dropdown>
  12. <el-dropdown-menu>
  13. <el-dropdown-item icon="Download" @click="handleExport" v-if="viewAdviser('business:deposit:export')">
  14. 导出</el-dropdown-item>
  15. </el-dropdown-menu>
  16. </template>
  17. </el-dropdown>
  18. </div>
  19. <!-- 列表区 -->
  20. <el-table v-loading="loading" :data="orderList" size="small" border height="100%"
  21. @selection-change="handleSelectionChange">
  22. <el-table-column type="selection" width="55" align="center" />
  23. <el-table-column align="center" type="index" label="序号" width="50"></el-table-column>
  24. <el-table-column label="日期" align="center" prop="depositDate" width="200" />
  25. <el-table-column label="委托单号" align="center" prop="formNo" width="120" />
  26. <el-table-column label="预存单位" align="center" prop="contactCompany" width="120" />
  27. <el-table-column label="签约主体" align="center" prop="signingSubject" width="120" />
  28. <el-table-column label="金额" align="center" prop="amount" width="120">
  29. <template #default="scope">
  30. <span>{{ rowNum(scope.row.amount) }}</span>
  31. </template>
  32. </el-table-column>
  33. <el-table-column label="附件" align="center" prop="files">
  34. <template #default="scope">
  35. <el-button link type="primary" size="small" @click="showFileList(scope.row)">查看</el-button>
  36. </template>
  37. </el-table-column>
  38. <el-table-column label="审核状态" align="center" width="80" prop="remark">
  39. <template #default="scope">
  40. <dict-tag :options="verify_status" :value="scope.row.status" />
  41. </template>
  42. </el-table-column>
  43. <el-table-column label="操作" align="center" prop="verifyStatus" width="200">
  44. <template #default="scope">
  45. <el-button v-show="scope.row.status === 0" link type="warning" size="small"
  46. @click="handleVerify(scope.row, 1)" v-hasPermi="['business:deposit:verify']">审核通过</el-button>
  47. <el-button v-show="scope.row.status === 0" link type="danger" size="small" @click="handleVerify(scope.row, 4)"
  48. v-hasPermi="['business:deposit:verify']">驳回</el-button>
  49. <el-button v-show="scope.row.status !== 0" link type="success" size="small" @click="handleInfo(scope.row)"
  50. v-hasPermi="['business:deposit:info']">查看</el-button>
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. <!-- <Deposit-form ref="DepositRef" :get-list="getList" /> -->
  55. <el-dialog title="存款信息" v-model="formOpen" width="500px" append-to-body draggable @close="formCancel"
  56. :close-on-click-modal="false">
  57. <el-form ref="dictRef" :model="form" label-width="100" size="small">
  58. <el-row :gutter="30">
  59. <el-col :span="24">
  60. <el-form-item label="预存合同:">
  61. <el-autocomplete v-if="form.status !== 1" :fetch-suggestions="querySearchEntrustOrderAsync"
  62. :trigger-on-focus="true" v-model="form.formNo" placeholder="请输入客户名称" popper-class="my-autocomplete"
  63. @select="handleSelectEntrustOrder">
  64. <template #default="{ item }">
  65. <div style="
  66. display: flex;
  67. flex-direction: row;
  68. justify-content: space-between;
  69. ">
  70. <div class="name" style="font-size: 12px">
  71. {{ item.formNo }}-{{ item.signingSubject }}
  72. </div>
  73. </div>
  74. </template>
  75. </el-autocomplete>
  76. <div v-else>{{ form.formNo }}</div>
  77. </el-form-item>
  78. </el-col>
  79. <el-col>
  80. <el-form-item label="签约主体:">
  81. <div>{{ form.signingSubject }}</div>
  82. </el-form-item>
  83. </el-col>
  84. <el-col>
  85. <el-form-item label="往来单位:">
  86. <div>{{ form.contactCompany }}</div>
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="24">
  90. <el-form-item label="存款金额:">
  91. <el-input-number v-if="form.status !== 1" v-model="form.amount" :precision="2" :step="0.1" :min="0"
  92. :controls="false" />
  93. <div v-else>{{ form.amount }}</div>
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="24">
  97. <el-form-item label="凭证附件:">
  98. <div class="details-btns-container" style="display: flex">
  99. <el-upload v-if="form.status !== 1" action="#" :http-request="upload" :with-credentials="true"
  100. :show-file-list="false" multiple>
  101. <el-button size="small" type="primary" icon="Upload">点击上传</el-button>
  102. </el-upload>
  103. </div>
  104. <el-table ref="filesTable" :data="form.files" size="small" height="200px" border
  105. header-row-class-name="list-header-row">
  106. <el-table-column v-if="form.status !== 1" label="操作" width="47" align="center">
  107. <template #default="scope">
  108. <el-button icon="Minus" size="small" circle type="danger" @click="handleDelFile(scope.$index)" />
  109. </template>
  110. </el-table-column>
  111. <el-table-column type="index" label="序号" width="47" align="center" />
  112. <el-table-column label="文件名" prop="originalFileName" align="center">
  113. <template #default="scope">
  114. <el-link :href="`${baseUrl}${scope.row.fileUrl}`" :underline="false" target="_blank" type="primary">
  115. {{ scope.row.originalFileName }}
  116. </el-link>
  117. </template>
  118. </el-table-column>
  119. </el-table>
  120. </el-form-item>
  121. </el-col>
  122. </el-row>
  123. </el-form>
  124. <template #footer>
  125. <div class="dialog-footer">
  126. <el-button type="primary" @click="saveHandler">确 定</el-button>
  127. <el-button @click="formCancel">取 消</el-button>
  128. </div>
  129. </template>
  130. </el-dialog>
  131. <!-- 分页 -->
  132. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  133. v-model:limit="queryParams.pageSize" @pagination="getList" />
  134. <free-amount-dialog ref="freeAmountDialogRef" :get-list="getList" />
  135. <el-image-viewer v-if="showViewer" :url-list="currentFileList" @close="closeImages" :initial-index="showIndex" />
  136. </div>
  137. </template>
  138. <script setup name="PrevDeposit">
  139. // import contractForm from "./form";
  140. import {
  141. listDeposit,
  142. delDeposit,
  143. exportDeposit,
  144. addDeposit,
  145. getDeposit,
  146. updateDeposit,
  147. listEntrustOrder,
  148. verifyDeposit,
  149. } from "@/api/business/entrust/deposit";
  150. // import ElImageViewer from 'element-plus/lib/components/image-viewer';
  151. import freeAmountDialog from "./freeAmountDialog.vue";
  152. import { uploadFile } from "@/api/tool/file";
  153. import { rowNum } from "@/utils/index";
  154. import { listCompany } from "@/api/business/crm/company";
  155. import useUserStore from "@/store/modules/user";
  156. import { ref } from "vue";
  157. // import DepositForm from "./form"
  158. const { proxy } = getCurrentInstance();
  159. /** 字典数组区 */
  160. /** 查询 对象 */
  161. const orderList = ref([]);
  162. const loading = ref(true);
  163. const ids = ref([]);
  164. const single = ref(true);
  165. const multiple = ref(true);
  166. const total = ref(0);
  167. const permissions = useUserStore().permissions;
  168. const all_permission = "*:*:*";
  169. const prev = ref([]);
  170. const baseUrl = ref(import.meta.env.VITE_APP_BASE_API);
  171. const showViewer = ref(false);
  172. const currentFileList = ref([]);
  173. const showIndex = ref(0);
  174. const freeAmountDialogRef = ref(null);
  175. const formOpen = ref(false);
  176. const form = ref({
  177. id: null,
  178. companyName: "",
  179. companyId: null,
  180. remark: "",
  181. type: 1,
  182. files: [],
  183. });
  184. const emptyForm = {
  185. id: null,
  186. companyName: "",
  187. companyId: null,
  188. type: 1,
  189. remark: "",
  190. files: [],
  191. };
  192. const { verify_status } = proxy.useDict("verify_status");
  193. /** 查询对象 */
  194. const queryParams = ref({
  195. pageNum: 1,
  196. pageSize: 20,
  197. companyName: "",
  198. noContract: 1,
  199. });
  200. /*********************** 方法区 ****************************/
  201. onActivated(() => {
  202. // 你的逻辑
  203. getList();
  204. });
  205. /** 查询company列表 */
  206. function getList() {
  207. loading.value = true;
  208. listDeposit(queryParams.value).then((response) => {
  209. orderList.value = response.rows.map((l) => ({ ...l }));
  210. prev.value = proxy.deepClone(response.rows);
  211. total.value = response.total;
  212. loading.value = false;
  213. });
  214. }
  215. /** 搜索按钮操作 */
  216. function handleQuery() {
  217. queryParams.value.pageNum = 1;
  218. getList();
  219. }
  220. //判断是否有权限
  221. function viewAdviser(quer) {
  222. return permissions.includes(all_permission) || permissions.includes(quer);
  223. }
  224. /** 重置按钮操作 */
  225. function resetQuery() {
  226. proxy.resetForm("queryRef");
  227. handleQuery();
  228. }
  229. // 多选框选中数据
  230. function handleSelectionChange(selection) {
  231. ids.value = selection.map((item) => item.id);
  232. single.value = selection.length != 1;
  233. multiple.value = !selection.length;
  234. }
  235. /** 新增按钮操作 */
  236. function handleAdd() {
  237. // proxy.$refs.DepositRef.open();
  238. formOpen.value = true;
  239. }
  240. function formCancel() {
  241. formOpen.value = false;
  242. reset();
  243. }
  244. function reset() {
  245. form.value = proxy.deepClone(emptyForm);
  246. }
  247. /** 修改按钮操作 */
  248. function handleUpdate(row) {
  249. // const id = row.id || ids.value;
  250. // proxy.$refs.DepositRef.open(id);
  251. }
  252. /** 删除按钮操作 */
  253. function handleDelete(row) {
  254. const _ids = row.id || ids.value;
  255. proxy.$modal
  256. .confirm("是否确认删除选中的数据项?")
  257. .then(function () {
  258. return delDeposit(_ids);
  259. })
  260. .then(() => {
  261. getList();
  262. proxy.$modal.msgSuccess("删除成功!");
  263. })
  264. .catch(() => { });
  265. }
  266. /** 导出按钮操作 */
  267. function handleExport() {
  268. // proxy.download(
  269. // "business/archive/order/export",
  270. // {
  271. // ...queryParams.value,
  272. // },
  273. // `合同导出_${new Date().getTime()}.xlsx`
  274. // );
  275. exportDeposit(queryParams.value);
  276. }
  277. function startDateChangeHandler(row, startDate) {
  278. if (startDate) {
  279. // console.log(startDate)
  280. row.endMonth = proxy
  281. .moment(startDate)
  282. .add(row.monthNum - 1, "M")
  283. .format("YYYY-MM-DD");
  284. } else row.endMonth = null;
  285. console.log(row);
  286. }
  287. function handleSelectCompany(item) {
  288. form.value.companyName = item.name;
  289. form.value.companyId = item.id;
  290. }
  291. function saveHandler() {
  292. if (
  293. form.value.entrustOrderId == null ||
  294. form.value.entrustOrderId === 0 ||
  295. form.value.entrustOrderId === ""
  296. ) {
  297. proxy.$modal.msgError("请选择存款委托合同");
  298. return;
  299. }
  300. if (form.value.amount == null || form.value.amount === 0) {
  301. proxy.$modal.msgError("请输入存款金额");
  302. return;
  303. }
  304. if (form.value.files.length === 0) {
  305. proxy.$modal.msgError("请上传凭证附件");
  306. return;
  307. }
  308. if (form.value.id == null) {
  309. addDeposit(form.value).then((res) => {
  310. formCancel();
  311. getList();
  312. });
  313. } else {
  314. updateDeposit(form.value).then((res) => {
  315. console.log("新增", form.value);
  316. formCancel();
  317. getList();
  318. });
  319. }
  320. }
  321. function upload(param) {
  322. const formData = new FormData();
  323. formData.append("file", param.file);
  324. uploadFile(formData).then((res) => {
  325. if (res.code === 200) {
  326. const file = {};
  327. file.fileName = res.originalFilename;
  328. file.url = res.url;
  329. file.originalFileName = res.originalFilename;
  330. file.fileUrl = res.fileName;
  331. form.value.files.push(file);
  332. }
  333. });
  334. }
  335. function openFollowFile(arg) {
  336. // console.log(arg)
  337. const attach = arg;
  338. window.open(`${arg.url}`, arg.fileName);
  339. }
  340. function showFileList(row) {
  341. currentFileList.value = row.files.map((l) => `${baseUrl.value}${l.fileUrl}`);
  342. showViewer.value = true;
  343. }
  344. function closeImages() {
  345. showViewer.value = false;
  346. }
  347. function querySearchEntrustOrderAsync(queryString, cb) {
  348. const query =
  349. queryString.length > 0
  350. ? { keyword: queryString, pageSize: 20, pageNum: 1, status: 1 }
  351. : { pageSize: 20, pageNum: 1, status: 1 };
  352. listEntrustOrder(query).then((res) => {
  353. cb(res.rows);
  354. });
  355. }
  356. function handleSelectEntrustOrder(item) {
  357. form.value.formNo = item.formNo;
  358. form.value.tenantId = item.tenantId;
  359. form.value.fromTenantId = item.fromTenantId;
  360. form.value.entrustOrderId = item.id;
  361. form.value.signingSubject = item.signingSubject;
  362. form.value.contactCompany = item.contactCompany;
  363. }
  364. function handleInfo(row) {
  365. formOpen.value = true;
  366. getForm(row.id);
  367. }
  368. function getForm(id) {
  369. getDeposit(id).then((res) => {
  370. form.value = res.data;
  371. if (form.value == null) {
  372. reset();
  373. }
  374. });
  375. }
  376. function handleVerify(row, status) {
  377. if (status === 1) {
  378. freeAmountDialogRef.value.open(row);
  379. } else {
  380. proxy.$modal
  381. .confirm(`确认${status === 1 ? "审核通过" : "驳回"}么?`)
  382. .then((_) => {
  383. const saveValue = proxy.deepClone(row);
  384. saveValue.status = status;
  385. return verifyDeposit(saveValue);
  386. })
  387. .then((res) => {
  388. getList();
  389. });
  390. }
  391. }
  392. function handleDelFile(index) {
  393. form.value.files.splice(index, 1);
  394. }
  395. getList();
  396. </script>